Wadah DI / IoC vs pabrik: Di mana saya mengkonfigurasi aplikasi saya dan mengapa?

9

Saya mencoba mencari tahu kapan harus menggunakan registri DIC / IoC untuk mengkonfigurasi perangkat lunak saya dan kapan harus menggunakan pabrik, bersama dengan alasan di balik kedua pendekatan tersebut.


Saya menggunakan StructureMap sebagai wadah DI saya (DIC), yang mudah dikonfigurasikan menggunakan pendaftar. Dalam DIC praktis semua objek yang terdaftar bersifat statis dalam arti, bahwa saya tidak perlu mengubah / menukar implementasi / instance pada saat runtime, setelah DIC dikonfigurasi dan mereka dikonfigurasi dalam DIC sebagai singleton. Namun, karena perangkat lunak saya (SW) akan berjalan pada perangkat yang berbeda, saya perlu memilih registri khusus perangkat tergantung pada perangkat yang menjalankan SW saya untuk mengkonfigurasi perangkat keras yang sesuai.

Karena pembangunan beberapa objek saya memerlukan pembacaan dalam file konfigurasi, saya menggunakan pabrik untuk mengembalikan instance ini ke DIC, untuk memisahkan pembacaan konfigurasi dari penciptaan objek. Saya mendaftarkan getter pabrik di DIC untuk jenis plugin yang sesuai.

Sekarang katakan saya memiliki jenis plugin IMotordengan jenis beton Motor1dan Motor2, yang harus ditangani oleh pabrik. Sekarang ada dua cara saya dapat memutuskan cara mengkonfigurasi perangkat saya:

  1. Saya meneruskan informasi tentang perangkat yang menjalankan SW ke MotorFactorydan mengembalikan motor yang benar, baik Motor1atau Motor2. Dalam hal ini logika untuk memutuskan ada di dalam Pabrik.
  2. Saya mengkonfigurasi DIC sesuai dengan perangkat itu berjalan dan membuat dua pabrik Motor1Factorydan Motor2Factory, di mana satu menciptakan Motor1dan yang lainnya Motor2. Dalam hal ini saya akan memiliki entri registri yang berbeda IMotordi dalam pendaftar khusus perangkat yang menggunakan salah satu Motor1Factoryatau Motor2Factory.

Sekarang pertanyaan saya adalah: Mana dari dua metode ini yang lebih disukai dan mengapa? Bagi saya, sepertinya kasus pertama tidak lurus ke depan dan berbelit-belit, karena saya menyebarkan logika yang memutuskan jenis apa yang akan dipakai di seluruh basis kode. Sedangkan dalam kasus kedua saya secara efektif mengalikan jumlah pabrik dalam kode saya, karena saya akan membutuhkan pabrik untuk (hampir) setiap jenis beton. Menjadi lebih membingungkan bagi saya, ketika pabrik-pabrik abstrak ditambahkan ke dalam campuran.

Jadi sekali lagi: Kapan saya harus menggunakan satu metode atau yang lain? Dan yang lebih penting: Apa indikator yang baik untuk memutuskan jalan mana yang harus ditempuh?

pengepakan
sumber
2
Jalan mana yang lebih sederhana? Apakah manfaat dari pendekatan yang lebih kompleks lebih besar daripada biaya kompleksitas tambahan?
Robert Harvey

Jawaban:

2

Jika Anda menggunakan keduanya, saya akan menggunakan sesuatu yang sederhana:

  • DI / IoC: untuk setiap konfigurasi yang tidak akan berubah saat runtime.
  • Factory: untuk membuat instance objek saat runtime yang bergantung pada parameter input runtime. Contoh pabrik disuntikkan oleh wadah DI.
Walfrat
sumber
1

Pabrik abstrak digunakan ketika Anda memiliki objek yang terkait melalui hierarki yang perlu bervariasi bersama. Saya tidak melihatnya di sini.

Yang saya lihat adalah Anda bertanya-tanya apakah pabrik harus memilih motor atau apakah DIC harus memilih pabrik yang memproduksi motor tertentu.

Sulit untuk memilih dengan tepat karena pabrik dan DIC melakukan hal yang sangat mirip. Perbedaannya adalah pabrik difokuskan pada masalah tertentu dan DIC lebih umum.

Itu muncul ke pertanyaan ini: apakah Anda memiliki kebutuhan untuk kode yang khusus untuk masalah ini yang akan tinggal di pabrik? Atau apakah ini lebih umum seperti membaca detail konfigurasi dari suatu file?

Ingatlah bahwa meskipun Anda mungkin hanya memilih antara Motor1dan Motor2hari ini, besok mungkin ada a Motor3. Mendukung desain yang akan membuat Motor3mudah ditambahkan.

candied_orange
sumber
0

Saya akan memisahkan logika "motor mana yang harus digunakan" menjadi Pabrik khusus yang disebut Builder (pola) dan menggunakan IOC-Container untuk kedua motor sebagai implementasi detail dari pembangun.

Sebagai aturan umum:

  • Anda memerlukan pabrik (atau pembangun) jika Anda harus membuat banyak objek dinamis dari kelas / antarmuka. (Yaitu untuk setiap mobil yang Anda hasilkan, Anda harus membuat satu motor baru)
  • jika Anda hanya membutuhkan satu instance statis kelas, ioc / di dapat melakukan pekerjaan untuk Anda (yaitu Anda hanya perlu satu instance statis dari layanan pembayaran dan satu instance statis dari MotorBuilderService)
k3b
sumber