Bağımlılık enjeksiyonuyla yapılandırmayı nasıl yönetirsiniz?


18

Ben DI / IOC'un büyük bir hayranıyım. Zor bağımlılıkları ele almak / soyutlamak için harikadır ve hayatı biraz daha kolaylaştırır.

Bununla birlikte, nasıl çözüleceğinden emin olmadığım küçük bir yakınma var.

DI / IOC'deki temel fikir, bir nesne başlatıldığında, tüm bağımlılıklarının yapıcı içinde önceden doldurulmuş olmasıdır.

Bununla birlikte, IMHO yapıcılar için çeşitli parametre türleri vardır (özellikle nesneleriniz değişmez olduğunda).

  1. Bağımlılıklar (Nesnenizin çalışması için gereken nesneler)
  2. Yapılandırma (çalışmak için gerekli ortam hakkında bilgi)
  3. Parametreler (Üzerinde çalışılan veriler)

IOC'nin bağımlılıklarla iyi çalıştığını düşünüyorum. Ama hala diğer ikisiyle başa çıkmanın en iyi yolunu bulmaya çalışıyorum. Ancak, kurucu IOC kapsayıcısı tarafından çalıştırılmak üzere çalıştırıldığından, bu öğeleri IOC kapsayıcısına yerleştirmem gerekiyor gibi görünüyor.

İnsanların hangi stratejileri / kalıpları kullandığını ve insanların ne gibi avantaj ve dezavantajlar bulduğunu bilmek istiyorum.

NB. Bunun son derece öznel bir soru olduğunun farkındayım ve bunu SE yönergelerine göre "iyi" öznel bir soru yapmaya çalıştım.


"Yapılandırma" ile dev-çevre yapılandırmasını (Geliştirme veya Üretim gibi) kastediyor musunuz? Öyleyse, bunu genellikle geleneksel bir Bağımlılık olarak ele alırım.
MetaFight

Bağımlılıklarla inşa etmek en iyisidir, ancak varsayılan yapılandırma, böylece nesne iyi biçimlendirilir. Yapılandırma ve diğer parametreleri ayarlamak için ek yöntemleri çağırın. Kasada çok fazla şey yapmak kötü bir şeydir.
david.pfx

I am still trying to work out the best way to deal with the other two- Nesnenize sıradan parametreler olarak iletilsin mi?
Robert Harvey

@RobertHarvey değişmez nesneler? Hata ayıklamayı çok daha kolay hale getirir.
ArTs

Yanıtlar:


9

Yapılandırma (çalışmak için gerekli ortam hakkında bilgi)

Çevre hakkında bilgi sağlamak olan bir yapılandırma sınıfı (seçici olmak için: bir arayüz + bir uygulama) oluşturun. Bu, yapılandırmayı hiçbir şekilde nesnenizin çalışması için gereken diğer nesnelerden farklı kılmaz (nokta 1).

Parametreler (Üzerinde çalışılan veriler)

Nesneye yönelik bir ortamda, ilkel veri türleri nesnelerde kapsüllenebilir, bu nedenle bu da 1. noktaya götürür. Ancak muhtemelen bu SO sorusunu ilginç bulacaksınız , bir DI kullanırken bir yapıcıdaki ilkel parametrelerin durumu ile tam olarak ilgilenir. bir kap. Verilen örnekte, tasarım geliştirilebilir, bu da yapıcıdaki ilkel tiplere olan ihtiyacı tamamen ortadan kaldırmıştır.


1

Yaptığım şey bu durumlar için bir fabrika modeli.

Nesnenin kendisini bağımlılık olarak kullanmıyorum, ancak kap tarafından otomatik olarak bağlanamayan parametreleri kabul eden bir Get yöntemi ile bir fabrika nesnesi oluşturuyorum.

Ör .:

 interface IDependencyObject {
       ....
 }

 class DependencyObject {

      public DependencyObject(int primitive, IAnotherDependency anotherDependency) {
      ...
      }

 }

 class DependencyObjectFactory {

      private readonly IAnotherDependency anotherDependency;

      public DependencyObjectFactory(IAnotherDependency anotherDependency) {
           this.anotherDependency = anotherDependency;
      }

      public IDependencyObject Get(int primitive) {
           return new DependencyObject(primitive, anotherDependency);
      }
 }

 interface IDependencyObjectFactory {
       IDependencyObject Get(int primitive);
 }
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.