2016-03-30 61 views
1
public interface IDoSomething 

public class ClassA : IDoSomething 
public class ClassB : IDoSomething 
public class ClassC : IDoSomething 

Birkaç sınıf tarafından uygulanan bir arabirime sahibim, ayrıca bazı verileri ayrıştırması gereken ve daha sonra bu nesnelerin yeni örneklerini oluşturması gereken bir kod bloğu da var. Şu anda hangi nesneyi kullanacağımı belirleyen büyük bir anahtar ifadem var ama daha iyi bir yol olmalı.Bir arabirimi birden çok kez uygulama için uygulama

Arabirimi de uygulayan, sınıfı kodlayan ve kodu yeniden kodlamak zorunda kalmayan yeni sınıflar oluşturabilmek istiyorum (anahtar deyiminde bir durum eklemek gibi).

Böyle bir şeyi uygulamak için en iyi uygulama nedir?

İşte benim şimdiki (berbat) switch deyimi gibi görünüyor:

switch (flag) 
{ 
    case 1: 
     return new ClassA(); 
    case 2: 
     return new ClassB(); 
    case 3: 
     return new ClassC(); 
    default: 
     return null; 
} 
+0

Bir sözlük kullanabilirsiniz .. 'dict = yeni Sözlük > {{1,() => yeni ClassA()}}' ve sonra yönteminiz (artı hata denetimi/eşleşmiyor) key control): 'dict [flag]();' – Rob

cevap

0

Bu abstract factory ne zaman kullanılacağına iyi bir örnektir. this page'a bir örnek verdim. İkinci kod bloğuna ilerlerseniz, aynı senaryoyu ele aldığını görürsünüz - Bir arayüzün uygulanmasını geri vermem gerekiyor ve hangi uygulamanın geri döneceğini söylemek için biraz değer kullanmak istiyorum.

Bunu DI kapsayıcı kullanmadan yapabilirsiniz, ancak bunlar, IDoSomething'un bir uygulamasını oluşturdukları zaman, bu uygulamanın da bağımlılıkları varsa, bunları da yarattıkları için, bunun için iyidir. Dolayısıyla, ClassA yapıcısına iletilecek bir şeye ihtiyaç duyuyorsa ve yapıcıya iletilen bir değere ihtiyaç duyuyorsa, DI kabı tüm bunları ele alır.

Windsor'u sevdiğimden, nice implementation özet fabrikasını sağlar.

Bu yanıtla ilgili sorun, bu sorunu çözmek için bağımlılık enjeksiyonuna dalmanızı tavsiye etmem. Ama gerçekten bunu tavsiye ederim. Arayüzlere program yapmaya çalışıyorsunuz ve bu tür tasarımları kolaylaştırıyor. Yaptığın şeyi alır ve bunu daha da kolaylaştıracak kadar kolay hale getirir.

Zeminden daha fazla açıklayan bir blog yazısı yazmalıyım.

+0

Sık sık bu tür şeyleri açıklamaya gerek bırakmayan blog yazıları için etrafa gereksiz bir jargon atmaya çalışıyorum. O zaman bulamadığım zaman kendim yazarım. (Daha iyi olup olmadığını bilmiyorum.) Ne tür bir proje? (WCF, web sitesi, vb.) Ya da sadece bir sınıf kütüphanesi, ne tür bir uygulamadan çağrılacak? Bir fikri ortaya atmaktan, tam olarak açıklamamdan/göstermekten ziyade, onu daha iyi açıklayan bir şey yazabilirim. –