Artikel yang bagus untuk mempelajari tentang cakupan dan siklus hidup kontrol Autofac, cakupan siklus hidup setara dengan unit kerja dalam aplikasi Anda, unit kerja akan memulai cakupan siklus proses di awal, dan kemudian layanan yang memerlukan unit kerja tersebut diurai dari cakupan siklus hidup.
Cakupan Seumur Hidup
Buat Cakupan Lifetme
Buat cakupan secara manual dan Pembuangan. Cakupan seumur hidup dapat dipakai dan melacak pembuangan komponen, jadi pastikan Anda selalu memanggil "Dispose()" atau membungkusnya dalam pernyataan "menggunakan".
Cakupan Masa Pakai Label
Terkadang Anda mungkin perlu berbagi beberapa layanan dalam Unit kerja, tetapi Anda tidak ingin menggunakan kenyamanan berbagi global, seperti mode singleton. Misalnya, siklus hidup per permintaan aplikasi web, dalam hal ini Anda dapat menggunakan InstancePerMatchingLifetimeScope untuk mengidentifikasi siklus hidup dan layanan Anda.
Misalnya, ada komponen yang mengirim email, dan logika transaksi perlu mengirim pesan beberapa kali, sehingga layanan email dapat dibagikan di setiap irisan transaksi logis. Jika Anda tidak ingin komponen email menjadi singleton global, Anda dapat mengaturnya sebagai berikut.
Menambahkan Pendaftaran ke Cakupan Seumur Hidup
Autofac memungkinkan Anda menambahkan "dengan cepat" saat membuat siklus hidup. Ini dapat membantu Anda ketika Anda perlu melakukan semacam penggantian pendaftaran terbatas "las titik" atau jika Anda umumnya hanya membutuhkan beberapa hal tambahan dalam lingkup yang tidak ingin Anda daftarkan secara global. Anda melakukannya dengan meneruskan lambda ke BeginLifetimeScope() yang mengambil ContainerBuilder dan menambahkan pendaftaran. (Saat membuat siklus proses, daftarkan layanan tambahan tanpa pendaftaran global)
Cakupan Instans
Cakupan instans menentukan bagaimana instans dibagikan antar permintaan. Saat meminta layanan, autofac dapat mengembalikan cakupan instans tunggal, instans baru per cakupan dependensi, atau singleton dalam konteks, seperti utas atau permintaan HTTP per cakupan seumur hidup. Ini berlaku untuk instans yang dikembalikan dari panggilan Resolve() eksplisit serta instans yang dibuat secara internal oleh kontainer untuk memenuhi dependensi komponen lain.
- Instans per dependensi
- Instans Tunggal
- Lingkup Instans Per Masa Pakai
- Instans per cakupan masa pakai yang cocok
- Instans Per Permintaan
- Instans per Dimiliki
- Lingkup Utas
Instans per dependensi
Juga disebut transient' atau 'factory' di kontainer lain, ini mengembalikan instance unik setiap kali layanan diminta. Jika tidak ada siklus hidup yang ditentukan, ini adalah perilaku default.
Setiap dependensi Resolve mengembalikan komponen baru.
Instans Tunggal
Instans yang sama dikembalikan di semua permintaan dan cakupan berlapis.
Lingkup Instans Per Masa Pakai
Cakupan ini dapat diterapkan ke cakupan berlapis. Komponen cakupan per masa pakai memiliki maksimum satu instans dalam cakupan berlapis. Ini berguna untuk objek khusus untuk satu unit kerja yang mungkin perlu bersarang unit kerja logis tambahan. Setiap cakupan masa pakai berlapis akan mendapatkan instans baru dari dependensi terdaftar.
Saat Anda mengurai komponen instans cakupan per masa penuh, hanya ada satu instans di setiap cakupan berlapis (misalnya per unit kerja).
Instans per cakupan masa pakai yang cocok
Ini mirip dengan Instance Per Lifetime Coverage, tetapi kontrol dapat dibagikan dengan instance yang lebih tepat. Saat membuat siklus hidup bertingkat, Anda dapat memberi label atau memberinya nama. Komponen dengan cakupan per-matching-lifetime akan memiliki paling banyak satu instance per cakupan masa pakai berlapis yang cocok dengan nama yang diberikan。 Hal ini memungkinkan pembuatan singleton tercakup, di mana siklus berlapis dapat berbagi komponen tanpa membuat instans global.
Berguna untuk unit kerja tunggal, seperti permintaan http, yang dibuat sebagai siklus hidup berlapis. Jika masa pakai berlapis dibuat per permintaan HTTP, maka komponen apa pun dengan cakupan per masa pakai akan memiliki instans per permintaan HTTP. (Selengkapnya tentang cakupan masa pakai per permintaan di bawah.)
Dalam sebagian besar aplikasi, hanya satu bersarang kontainer hierarkis yang diperlukan untuk mewakili unit kerja. Jika beberapa tingkat berlapis diperlukan (misalnya, global->request->transaction), komponen dapat dibuat untuk dibagikan pada tingkat tertentu melalui tag.
Saat siklus hidup berlapis dimulai, tag dikaitkan dengan siklus hidup tersebut. Anda akan mendapatkan pengecualian jika mencoba menyelesaikan komponen cakupan masa pakai per pencocokan ketika tidak ada cakupan masa pakai yang diberi nama yang benar. (Jika siklus hidup tag yang belum disimpan diuraikan, pengecualian akan terjadi.)
Instans Per Permintaan
Beberapa jenis aplikasi secara alami memiliki semantik tipe "permintaan", seperti ASP.NET MVC. Di antara jenis aplikasi ini, ada baiknya memiliki beberapa bentuk "singleton per permintaan". Instans per permintaan dibangun di atas instans per cakupan masa pakai yang cocok dengan menyediakan tag cakupan seumur hidup yang terkenal, metode kenyamanan pendaftaran, dan integrasi untuk aplikasi umum jenis (satu instans per permintaan dibangun di atas cakupan masa pakai per yang cocok dengan menyediakan tag seumur hidup yang terkenal, metode kenyamanan pendaftaran, dan integrasi untuk jenis aplikasi umum). Pada dasarnya, ini sesuai cakupan masa pakai yang cocok.
Ini berarti bahwa jika tidak ada permintaan saat ini, dan Anda mengurai komponen yang terdaftar berdasarkan instance-per-request, pengecualian akan dilemparkan. Ada FAQ terperinci yang menguraikan cara bekerja dengan masa pakai per permintaan.
Login hyperlink terlihat.
Instans per Dimiliki
Jenis hubungan implisit yang dimiliki, menciptakan siklus hidup bertingkat baru. Dependensi dapat dibatasi pada instans host dengan mendaftar ke instans per milik.
Dalam contoh ini, layanan ServiceForHandler akan dicakup ke masa pakai instans MessageHandler yang dimiliki.
Lingkup Utas
Anda dapat merujuknya
Login hyperlink terlihat.
Pertempuran aktual
Saya menggunakan mode Instance Per Lifetime Scope.
Di winform, ketika panggilan dijalankan, ia menggunakan konteks database setiap kali, seperti yang ditunjukkan pada gambar di bawah ini:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 Dalam kasus multi-threading dan konkurensi, jika Anda menggunakan konteks db yang sama, Anda akan menemukan pengecualian saat menambahkan, menghapus, memodifikasi, atau memeriksa database.
Saya ingin autofac mengembalikan objek baru setiap kali saya mengklik tombol, kodenya adalah sebagai berikut:
Seperti yang ditunjukkan di bawah ini:
(Akhir) |