Pabrik membuat pengujian menjadi menyakitkan dan tidak memungkinkan pertukaran implementasi yang mudah. Mereka juga tidak membuat dependensi terlihat (misalnya Anda memeriksa suatu metode, tidak menyadari fakta bahwa ia memanggil metode yang memanggil metode yang memanggil metode yang menggunakan database).
Saya tidak begitu setuju. Setidaknya tidak secara umum.
Pabrik sederhana:
public IFoo GetIFoo()
{
return new Foo();
}
Injeksi sederhana:
myDependencyInjector.Bind<IFoo>().To<Foo>();
Kedua cuplikan memiliki tujuan yang sama, mereka mengatur tautan antara IFoo
dan Foo
. Yang lainnya hanyalah sintaks.
Mengubah Foo
menjadi ADifferentFoo
membutuhkan banyak upaya tepat di kedua sampel kode.
Saya pernah mendengar orang berpendapat bahwa injeksi ketergantungan memungkinkan ikatan yang berbeda untuk digunakan, tetapi argumen yang sama dapat dibuat tentang pembuatan pabrik yang berbeda. Memilih ikatan yang tepat sama rumitnya dengan memilih pabrik yang tepat.
Metode pabrik memungkinkan Anda untuk menggunakan misalnya Foo
di beberapa tempat dan ADifferentFoo
di tempat lain. Beberapa mungkin menyebut ini baik (berguna jika Anda membutuhkannya), beberapa mungkin menyebut ini buruk (Anda bisa melakukan pekerjaan setengah-setengah untuk mengganti semuanya).
Namun, tidak terlalu sulit untuk menghindari ambiguitas ini jika Anda tetap menggunakan metode tunggal yang mengembalikan IFoo
sehingga Anda selalu memiliki sumber tunggal. Jika Anda tidak ingin menembak diri sendiri di kaki, jangan memegang senapan yang dimuat, atau pastikan untuk tidak mengarahkannya ke kaki Anda.
Dependecy injection secara besar-besaran membengkak daftar argumen konstruktor dan itu mengolesi beberapa aspek di seluruh kode Anda.
Inilah sebabnya mengapa beberapa orang lebih suka untuk secara eksplisit mengambil dependensi dalam konstruktor, seperti ini:
public MyService()
{
_myFoo = DependencyFramework.Get<IFoo>();
}
Saya pernah mendengar argumen pro (tanpa konstruktor mengasapi), saya pernah mendengar argumen con (menggunakan konstruktor memungkinkan lebih banyak otomatisasi DI).
Secara pribadi, sementara saya telah menghasilkan untuk senior kami yang ingin menggunakan argumen konstruktor, saya telah melihat masalah dengan dropdownlist di VS (kanan atas, untuk menelusuri metode kelas saat ini) di mana nama metode tidak terlihat ketika satu metode tanda tangan lebih panjang dari layar saya (=> konstruktor kembung).
Pada tingkat teknis, saya juga tidak peduli. Pilihan mana pun membutuhkan usaha yang sama untuk mengetik. Dan karena Anda menggunakan DI, Anda biasanya tidak akan memanggil konstruktor secara manual. Tetapi bug Visual Studio UI membuat saya mendukung tidak membengkak argumen konstruktor.
Sebagai catatan tambahan, injeksi ketergantungan dan pabrik tidak saling eksklusif . Saya memiliki kasus-kasus di mana daripada memasukkan dependensi, saya telah memasukkan sebuah pabrik yang menghasilkan dependensi (NInject untungnya memungkinkan Anda untuk menggunakan Func<IFoo>
sehingga Anda tidak perlu membuat kelas pabrik yang sebenarnya).
Kasus penggunaan untuk ini jarang terjadi tetapi memang ada.