Saya ingin menerapkan injeksi ketergantungan (DI) di ASP.NET Core. Jadi setelah menambahkan kode ini ke ConfigureServices
metode, kedua cara kerjanya.
Apa perbedaan antara metode services.AddTransient
dan service.AddScoped
dalam ASP.NET Core?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddScoped<IEmailSender, AuthMessageSender>();
}
c#
asp.net-core
.net-core
Elvin Mammadov
sumber
sumber
Jawaban:
TL; DR
Untuk klarifikasi lebih lanjut, contoh ini dari dokumentasi ASP.NET menunjukkan perbedaan:
Untuk menunjukkan perbedaan antara opsi masa hidup dan pendaftaran ini, pertimbangkan antarmuka sederhana yang mewakili satu atau beberapa tugas sebagai operasi dengan pengidentifikasi unik
OperationId
,. Bergantung pada bagaimana kami mengonfigurasi masa pakai untuk layanan ini, wadah akan memberikan contoh layanan yang sama atau berbeda untuk kelas yang meminta. Untuk memperjelas masa hidup yang diminta, kami akan membuat satu jenis opsi seumur hidup:Kami mengimplementasikan antarmuka ini menggunakan kelas tunggal
Operation
,, yang menerima GUID dalam konstruktornya, atau menggunakan GUID baru jika tidak ada yang disediakan:Selanjutnya, dalam
ConfigureServices
, setiap jenis ditambahkan ke wadah sesuai dengan masa pakai namanya:Perhatikan bahwa
IOperationSingletonInstance
layanan ini menggunakan instance khusus dengan ID yang diketahuiGuid.Empty
, sehingga akan menjadi jelas saat jenis ini digunakan. Kami juga telah mendaftarkanOperationService
yang tergantung pada masing-masingOperation
jenis lainnya , sehingga akan menjadi jelas dalam permintaan apakah layanan ini mendapatkan instance yang sama dengan controller, atau yang baru, untuk setiap jenis operasi. Semua layanan ini lakukan adalah mengekspos dependensi sebagai properti, sehingga mereka dapat ditampilkan dalam tampilan.Untuk menunjukkan masa hidup objek di dalam dan di antara permintaan individu yang terpisah ke aplikasi, sampel menyertakan
OperationsController
yang meminta setiap jenisIOperation
jenis sertaOperationService
. TheIndex
aksi kemudian menampilkan semua controller dan layanan iniOperationId
nilai-nilai.Sekarang dua permintaan terpisah dibuat untuk tindakan pengontrol ini:
Amati
OperationId
nilai mana yang bervariasi dalam satu permintaan, dan antara permintaan.Objek transien selalu berbeda; contoh baru disediakan untuk setiap pengontrol dan setiap layanan.
Objek yang dilingkupi sama dalam permintaan, tetapi berbeda di antara permintaan yang berbeda
Objek singleton adalah sama untuk setiap objek dan setiap permintaan (terlepas dari apakah instance disediakan di
ConfigureServices
)sumber
Dalam injeksi dependensi .NET ada tiga masa hidup utama:
Singleton yang menciptakan satu instance di seluruh aplikasi. Ini menciptakan instance untuk pertama kalinya dan menggunakan kembali objek yang sama di semua panggilan.
Layanan seumur hidup yang tercakup dibuat sekali per permintaan dalam ruang lingkup. Ini setara dengan singleton dalam lingkup saat ini. Misalnya, dalam MVC ia membuat satu instance untuk setiap permintaan HTTP, tetapi ia menggunakan instance yang sama dalam panggilan lain dalam permintaan web yang sama.
Layanan seumur hidup sementara dibuat setiap kali mereka diminta. Seumur hidup ini bekerja paling baik untuk layanan yang ringan dan tanpa kewarganegaraan.
Di sini Anda dapat menemukan dan contoh untuk melihat perbedaannya:
ASP.NET 5 MVC6 Ketergantungan Injeksi dalam 6 Langkah (tautan arsip web karena tautan mati)
Injeksi Ketergantungan Anda siap ASP.NET: ASP.NET 5
Dan ini adalah tautan ke dokumentasi resmi:
Ketergantungan injeksi dalam ASP.NET Core
sumber
Transient, scoped, dan singleton mendefinisikan proses pembuatan objek dalam ASP.NET MVC core DI ketika beberapa objek dari jenis yang sama harus disuntikkan. Jika Anda baru mengenal injeksi ketergantungan, Anda dapat melihat video DI IoC ini .
Anda dapat melihat kode pengontrol di bawah ini di mana saya telah meminta dua contoh "IDal" di konstruktor. Transient, Scoped, dan Singleton menentukan apakah instance yang sama akan disuntikkan dalam "_dal" dan "_dal1" atau berbeda.
Transient: Dalam transient, instance objek baru akan disuntikkan dalam satu permintaan dan respons. Di bawah ini adalah gambar snapshot tempat saya menampilkan nilai-nilai GUID.
Scoped: Dalam scoped, instance objek yang sama akan disuntikkan dalam satu permintaan dan respons.
Singleton: Dalam singleton, objek yang sama akan disuntikkan di semua permintaan dan tanggapan. Dalam hal ini satu instance global objek akan dibuat.
Di bawah ini adalah diagram sederhana yang menjelaskan dasar secara visual di atas.
Gambar di atas dibuat oleh tim SBSS ketika saya mengikuti pelatihan ASP.NET MVC di Mumbai . Terima kasih banyak kepada tim SBSS untuk membuat gambar di atas.
sumber
new TService
. Scoped akan melakukan cache inisialisasi pertama untuk "ruang lingkup" (permintaan http dalam kebanyakan kasus). Singleton hanya akan melakukan cache satu kali selama masa aplikasi, Sederhana seperti itu. Diagram di atas sangat berbelit-belit.Biasanya permintaan kode harus dilakukan melalui parameter konstruktor, seperti pada
Saya ingin menunjukkan jawaban @ akazemis bahwa "layanan" dalam konteks DI tidak menyiratkan layanan tenang; layanan adalah implementasi dari dependensi yang menyediakan fungsionalitas.
sumber
AddSingleton ()
AddSingleton () membuat satu instance dari layanan ketika pertama kali diminta dan menggunakan kembali instance yang sama di semua tempat di mana layanan itu diperlukan.
AddScoped ()
Dalam layanan mencakup, dengan setiap permintaan HTTP, kami mendapatkan contoh baru. Namun, dalam permintaan HTTP yang sama, jika layanan diperlukan di banyak tempat, seperti dalam tampilan dan di controller, maka contoh yang sama disediakan untuk seluruh ruang lingkup permintaan HTTP itu. Tetapi setiap permintaan HTTP baru akan mendapatkan layanan baru.
AddTransient ()
Dengan layanan sementara, instance baru disediakan setiap kali instance layanan diminta apakah itu dalam lingkup permintaan HTTP yang sama atau melintasi permintaan HTTP yang berbeda.
sumber
Setelah mencari jawaban untuk pertanyaan ini, saya menemukan penjelasan yang cemerlang dengan contoh yang ingin saya bagikan kepada Anda.
Anda dapat menonton video yang menunjukkan perbedaan DI SINI
Dalam contoh ini kita memiliki kode yang diberikan ini:
HomeController
Buat Tampilan
Startup.cs
Salin-tempel kode ini dan tekan tombol buat di tampilan dan beralih di antara
AddSingleton
,AddScoped
danAddTransient
Anda akan mendapatkan hasil berbeda setiap kali yang akan membantu Anda memahami penjelasan ini:sumber
Yang mana yang akan digunakan
Sementara
Lingkup
Singleton
Gunakan Lajang di mana Anda perlu mempertahankan status lebar aplikasi. Konfigurasi atau parameter aplikasi, Layanan Logging, caching data adalah beberapa contoh di mana Anda dapat menggunakan lajang.
Menyuntikkan layanan dengan masa hidup yang berbeda ke yang lain
sumber
Seperti dijelaskan di sini (tautan ini sangat berguna) dengan contoh,
sumber
Mendaftarkan Layanan
Inti ASP.NET menyediakan 3 metode berikut untuk mendaftarkan layanan dengan wadah injeksi ketergantungan. Metode yang kami gunakan menentukan masa pakai layanan terdaftar.
AddSingleton () - Seperti namanya, metode AddSingleton () menciptakan layanan Singleton. Layanan Singleton dibuat ketika pertama kali diminta. Contoh yang sama ini kemudian digunakan oleh semua permintaan berikutnya. Jadi secara umum, layanan Singleton dibuat hanya satu kali per aplikasi dan satu instance digunakan sepanjang waktu aplikasi.
AddTransient () - Metode ini menciptakan layanan Transient. Mesin virtual baru layanan Transient dibuat setiap kali diminta.
AddScoped () - Metode ini menciptakan layanan Scoped. Sebuah instance baru dari layanan Scoped dibuat sekali per permintaan dalam lingkup. Misalnya, dalam aplikasi web itu membuat 1 instance per setiap permintaan http tetapi menggunakan instance yang sama dalam panggilan lain dalam permintaan web yang sama.
sumber