DI / IoC konteyneri ve fabrikalar: Uygulamamı nerede yapılandırabilirim ve neden?


9

Yazılımımı yapılandırmak için DIC / IoC kayıt defterini ne zaman kullanacağımı ve fabrikaları ne zaman kullanacağımı, her iki yaklaşımın ardındaki gerekçe ile anlamaya çalışıyorum.


Yapılar kullanılarak yapılandırılması kolay DI konteyner (DIC) olarak StructureMap kullanıyorum. DIC'de neredeyse tüm kayıtlı nesneler statiktir, DIC yapılandırıldıktan ve DIC'de tekil olarak yapılandırıldıktan sonra çalışma zamanında herhangi bir uygulamayı / örneği değiştirmem / değiştirmem gerekmez. Benim yazılım (SW) farklı cihazlarda çalışacak Ancak, ben gereğini yapmak amacıyla benim GB çalışır buna göre donanım yapılandırılması için bu cihaza bağlı bir cihaza özgü kayıt seçin.

Bazı nesnelerimin yapılandırması yapılandırma dosyalarında okuma gerektirdiğinden, yapılandırmanın okunmasını nesnenin oluşturulmasından ayırmak için bu örnekleri DIC'ye döndürmek için fabrikaları kullanıyorum. İlgili eklenti türleri için fabrika alıcılarını DIC'ye kaydettim.

Şimdi IMotorbeton tiplerine sahip bir eklenti tipim olduğunu Motor1ve Motor2bir fabrika tarafından ele alınması gerektiğini söyleyin . Şimdi cihazımı nasıl yapılandıracağım konusunda iki yol var:

  1. Yazılımın üzerinde çalıştığı cihaz hakkında bilgi aktarıyorum MotorFactoryve ya doğru motoru döndürüyor ya Motor1da Motor2. Bu durumda karar verme mantığı Fabrika içindedir .
  2. Bunun üzerinde çalışan ve iki fabrika oluşturmak cihaza göre DIC yapılandırmak Motor1Factoryve Motor2Factorybir oluşturur nerede, Motor1ve diğer Motor2. Bu durumda ben kayıt defteri girdilerini farklı olurdu IMotorbirini kullanabilirsiniz cihaza özgü kütüklerinde Motor1Factoryveya Motor2Factory.

Şimdi sorum şu: Bu iki yöntemden hangisi tercih edilir ve neden? Bana göre, ilk durum düz ve kıvrımlı değil gibi görünüyor, çünkü kod tabanı boyunca hangi türün somutlaştırılacağına karar veren mantığı yayıyorum. İkinci durumda, kodumdaki fabrika sayısını etkili bir şekilde çarpıyorum, çünkü her beton türü için (neredeyse) bir fabrikaya ihtiyacım olacak. Karışıma soyut fabrikalar eklendiğinde benim için daha da kafa karıştırıcı oluyor.

Tekrar söylüyorum: Ne zaman bir yöntemi veya diğerini kullanmalıyım? Ve daha da önemlisi: Hangi yöne gidileceğine karar vermek için iyi göstergeler nelerdir?


2
Hangi yol daha basit? Daha karmaşık yaklaşımın faydaları ek karmaşıklığın maliyetinden daha ağır mıdır?
Robert Harvey

Yanıtlar:


2

Her ikisini de kullanırsanız basit bir şey için gideceğim:

  • DI / IoC: çalışma zamanında değişmeyen her yapılandırma için.
  • Fabrika: çalışma zamanında, çalışma zamanı giriş parametrelerine bağlı nesne örneği oluşturmak içindir. Fabrika örnekleri DI konteyneri tarafından enjekte edilir.

1

Soyut fabrikalar, birlikte değişmesi gereken bir hiyerarşi ile ilgili nesneleriniz olduğunda kullanılır. Bunu burada görmüyorum.

Gördüğüm şey, bir fabrikanın motoru seçmesi mi yoksa DIC'in belirli bir motoru üreten bir fabrikayı mı seçmesi gerektiğini merak ediyor olmanız.

Kesinlikle seçmek zor çünkü bir fabrika ve bir DIC çok benzer şeyler yapıyor. Fark, fabrikanın belirli bir konuya odaklanması ve DIC'nin daha genel olmasıdır.

Bu soruya geliyor: fabrikada yaşayacak bu soruna özgü bir koda ihtiyacınız var mı? Yoksa daha genel bir dosyadan yapılandırma ayrıntılarını okumak gibi mi?

Yalnızca bugün Motor1ile Motor2bugün arasında seçim yaparken , yarın bir Motor3. Eklemeyi Motor3kolaylaştıracak tasarımı tercih edin .


0

"Hangi motorun kullanılacağı" mantığını Builder (desen) adı verilen özel bir Fabrikaya ayırır ve her iki motor için de IOC-Container'ı üreticinin uygulama detayı olarak kullanırdım.

Genel bir kural olarak:

  • sınıfın / arabirimin birçok dinamik nesnesini oluşturmanız gerekiyorsa bir fabrikaya (veya bir üreticiye) ihtiyacınız vardır. (yani ürettiğiniz her araba için yeni bir motor oluşturmanız gerekir)
  • sınıfın yalnızca bir statik örneğine ihtiyacınız varsa, ioc / di işi sizin için yapabilir (yani, ödeme hizmetinin yalnızca bir statik örneğine ve MotorBuilderService'in bir statik örneğine ihtiyacınız vardır)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.