Saya telah berpikir sedikit tentang bagaimana injeksi ketergantungan dapat lebih baik diintegrasikan secara langsung ke dalam bahasa seperti C #. Saya telah menemukan solusi potensial yang ingin saya dengar pendapat Anda. Saya belum pernah menggunakan banyak kerangka kerja injeksi ketergantungan sehingga mungkin ada sesuatu yang saya abaikan
Bagaimanapun, idenya adalah untuk dapat mendeklarasikan properti sebagai "dapat disuntikkan" menggunakan kata kunci. Ketika sebuah objek dipakai, dan properti itu tidak diinisialisasi melalui konstruktor, atau penginisialisasi objek, ia meminta instance dari tipe properti itu dari beberapa layanan global.
Demikian pula Anda mendaftarkan penangan untuk jenis yang berbeda ke layanan itu sehingga Anda dapat instantiate jenis properti yang diinjeksi.
Keuntungan menggunakan jenis arsitektur IMO ini adalah ia cukup fleksibel dan mudah digunakan. The downside adalah bahwa mungkin ada beberapa overhead melakukan panggilan ke singleton setiap kali Anda memulai kelas yang memiliki suntikan.
Kemudian lagi itu hanya masalah untuk kelas yang sering dipakai dalam solusi kinerja tinggi sehingga seharusnya tidak menjadi masalah. Mungkin Anda bisa menggunakan semacam pabrik dalam hal itu.
Pikiran, masalah, pertanyaan, ide yang lebih baik?
Kode
public class SomeClass
{
public SomeClass()
{
//implicit behavior if Animal is not set in constructor or initializer
this.Animal = GlobalInjector.Get(this,typeof(Mammal))
}
public injectable Mammal Animal
{
get;
set;
}
}
GlobalInjector.Register(typeof(Mammal), () => return new Mammal(someParameter));
Jawaban:
Ada hal-hal yang termasuk dalam bahasa, dan hal-hal yang tidak. Dulu C mengakui bahwa IO tidak termasuk dalam bahasa karena itu eksternal untuk model komputasi dan dapat diimplementasikan dengan perpustakaan fungsi.
Ketergantungan Injeksi adalah seperti itu. Ini eksternal untuk bahasa dan dapat diimplementasikan dengan kerangka kerja yang sesuai.
Salah satu masalah dengan bahasa modern adalah mereka mencoba melakukan terlalu banyak. Akhirnya bahasa-bahasa itu runtuh karena bobotnya sendiri ketika programmer melarikan diri ke bahasa yang lebih sederhana.
sumber
Itu tidak diperlukan
Salah satu hal yang paling saya sukai tentang kerangka kerja DI terbaik yang saya gunakan adalah bahwa kode konfigurasi tingkat atas adalah satu-satunya bagian dari kode Anda yang perlu diketahui tentang DI. Pengkabelan otomatis dilakukan pada tingkat wadah dan konfigurasi / "memuat modul", dan kode aplikasi Anda dapat sepenuhnya tidak menyadarinya.
Ini berarti tidak ada atribut, tidak ada string sihir, tidak ada konvensi. Setiap bagian dari kode hanya tahu bahwa ia menerima kode dalam konstruktornya (/ properties / methods), dan itu saja.
Dengan desain seperti itu Anda tidak perlu mengubah bahasa sama sekali untuk mendukung Dependency Injection.
Ini berpotensi berbahaya
Hal yang paling saya takuti tentang sistem injeksi ketergantungan terintegrasi bahasa adalah bahwa ia akan meningkatkan penghalang terhadap implementasi lainnya, namun mungkin akan melukis dirinya sendiri ke sudut dalam beberapa aspek.
Beberapa cara itu bisa melukis dirinya sendiri ke sudut:
sumber
Pernahkah Anda melihat Framework Extensibility Managed yang datang dengan .NET 4? Inilah artikel yang saya tulis dengan beberapa contoh. Pada dasarnya ini adalah bentuk injeksi ketergantungan yang dibangun ke dalam .NET, dengan fitur tambahan run-time dapat ditemukan.
Suntikan properti terlihat seperti ini:
Suntikan konstruktor terlihat seperti ini:
Anda dapat mengimpor bidang, melakukan impor opsional, mengimpor koleksi layanan, termasuk melakukan malas mengimpor dengan metadata sehingga Anda dapat mencari layanan yang sesuai untuk instantiate. Anda bahkan dapat mengimpor kembali saat runtime untuk mencari ekstensi baru.
sumber
sumber