8

Clean Code Talks dinledikten sonra, nesneleri oluşturmak için fabrikaları kullanmamız gerektiğini anladım. Bu nedenle, örneğin, eğer bir House bir Door sahiptir ve DoorHouseFactory yılında yeni bir DoorKnob oluşturup Door kurucusuna geçmek ve sonra House kurucusuna yeni Door nesneyi geçmesi, bir DoorKnob sahiptir. Oluşturucu Enjeksiyonu - Fabrikaları da mi enjekte ediyoruz?

Ama ne House(diyelim sınıf adıdır ABC) kullanan sınıfın yaklaşık

? HouseFactory'a bağlı değil mi? Yani HouseFactory'u ABC yapıcısında mı geçelim? Kurucuda bir sürü fabrikaları bu şekilde geçmek zorunda kalmayacak mıyız?

cevap

9

, bir fabrika enjekte yok sen DooKnob kendisi enjekte edin.

Ev, diğer taraftan, ancak kapı kolunun üzerinde, Kapı bağlıdır :

Bu son kadar her şeyi oluşturmak için sahip seçenekleri açık tutar
public class House 
{ 
    private readonly Door door; 

    public House(Door door) 
    { 
     if (door == null) 
      throw new ArgumentNullException("door"); 

     this.door = door; 
    } 
} 

uygulamanın Composition Root:

var house = new House(new Door(new DoorKnob())); 

Bu düzeyde oluşturmak için DI Kapsayıcı kullanabilirsiniz, ancak yapmanız gerekmez. Hiçbir fabrika bulunmuyor.

+0

Cevabınız için teşekkürler. kompozisyon kökü hakkında bir soru. Bir EJB çağrısı veya bir web servisi söz konusu olduğunda kompozisyon kökü ne olmalıdır? Arayan yöntem kendisi mi? –

+0

Bunlar, bilmediğim Java özellikleridir, ancak genel bir konsept kompozisyonu çok geç gerçekleşir: Artık onu daha sonra erteleyemezsiniz. –

1

Çok fazla sayıda fabrikayı, sınıfınızın çok fazla yaptığını gösteren constructor over-injection adlı bir kod kokusu enjekte ederseniz.

Birçok konteyner, otomobil fabrikaları adı verilen bir özellik sağlar. Bu, T'un nasıl oluşturulacağını bilirlerse, otomatik olarak Func<T> türünde fabrikalar oluşturdukları anlamına gelir.

Castle Windsor, fabrika çıkışında bir fabrika uygulaması oluşturan Typed Factory facilities adlı gelişmiş bir özelliğe sahiptir.

Ayrıca, TecX project'da Unity için birleştirilmiş fabrikalar bağlantı noktası vardır.

public class Door 
{ 
    private readonly DoorKnob doorKnob; 

    public Door(DoorKnob doorKnob) 
    { 
     if (doorKnob == null) 
      throw new ArgumentNullException("doorKnob"); 

     this.doorKnob = doorKnob; 
    } 
} 

yok fabrikalar Bu seviyede görünürde şunlardır: - Kapı ve Kapı tokmağı örnek kalıyorum

0

Unity'yi kullanarak sonlandırırsanız, yakın bir tarihte Unity için Castle Windsor Typed Factories eşdeğerini uygulamıştım. Projeyi https://github.com/PombeirP/Unity.TypedFactories ve NuGet paketini http://nuget.org/packages/Unity.TypedFactories numaralı telefondan bulabilirsiniz.

kullanımıdır aşağıdadır:

unityContainer 
    .RegisterTypedFactory<IFooFactory>() 
    .ForConcreteType<Foo>(); 

sadece IFoo dönen bir yöntemle IFooFactory arayüzü oluşturmak zorunda ve dinlenme kütüphanede tarafından sizin için yapılır. IFooFactory'yi çözebilir ve hemen IFoo nesneleri oluşturmak için kullanabilirsiniz.