Bağımlılık Enjeksiyon (DI) &; dost" kütüphane"
C tasarımı sorguluyorum# birkaç farklı yüksek seviyede fonksiyonlara sahip olacak olan kütüphane. Tabii ki, üst düzey bu işlevleri SOLID sınıf tasarım prensipleri kullanarak mümkün olduğunca uygulanacaktır. Gibi, muhtemelen sınıfları tüketicilere doğrudan düzenli olarak kullanmaya yönelik olacak, ve "destek sınıfları" bunu daha sık görülen bu bağımlılıkları "kullanıcı" sınıfları.
Soru, bu yüzden kütüphane tasarımı için en iyi yolu nedir:
- Dİ Agnostik - Gerçi ekleyerek temel "destek" için bir ya da iki ortak Dİ kütüphaneler (StructureMap, Ninject, vb) gibi makul, istiyorum tüketiciler olmak üzere kütüphane ile herhangi bir Dİ çerçeve.
- Olmayan Dİ kullanılabilir - Eğer bir tüketici kütüphane kullanarak Dİ, kütüphane uyanık olarak kullanımı kolay olarak mümkün, azaltmak işin tutarı bir kullanıcı için oluşturmak için tüm bu "önemsiz" bağımlılıkları sadece "gerçek" sınıflar istedikleri için kullanın.
Benim şu anki düşünce "Dİ" ortak Dİ kitaplıkları (e.kayıt olmak için modülleri bir kaç sağlamaktır g StructureMap bir kayıt, Ninject modülü), ve non-Dİ ve o birkaç için bir bağlantı içeren bir dizi ya da Fabrika sınıfları fabrikalar.
Düşünceler?
CEVAP
Bu Dİ hakkında olduğunuzu anladığınızda, aslında yapmak çok basitdesenleri ve prensipleriteknoloji değil.
Konteyner-agnostik yolu bir Dİ API tasarımı için şu genel kurallara uyun:
Bir arayüz için Program, bir uygulama değil
Bu ilke aslında bir alıntı (bellekten rağmen) Design Patterns, ama her zaman olmalıgerçek amaç.Dİ sadece bu sonuca ulaşmak için bir araçtır.
Hollywood Prensibi geçerlidir
Dİ açısından Hollywood Prensibi şöyle der:Dİ Konteyner deme, diyorsun.
Doğrudan kodunuz içinden bir kap çağırarak bir bağımlılık için sormak asla. Kullanarak dolaylı olarak sorYapıcı Enjeksiyon.
Yapıcı Enjeksiyon Kullanın
Bir bağımlılık ihtiyacınız olduğunda, isteyinstatik olarakile kurucu:
public class Service : IService
{
private readonly ISomeDependency dep;
public Service(ISomeDependency dep)
{
if (dep == null)
{
throw new ArgumentNullException("dep");
}
this.dep = dep;
}
public ISomeDependency Dependency
{
get { return this.dep; }
}
}
Hizmet sınıf değişmezler garanti nasıl dikkat edin. Bir örneği oluşturulduktan sonra, bağımlılık Koruma maddesi kombinasyonu ve readonly
anahtar kelime nedeniyle kullanılabilir olması sağlanır.
Eğer kısa ömürlü bir nesne gerekiyorsa Soyut Fabrika kullanın
Bağımlılıklar Yapıcı Enjeksiyon ile enjekte uzun ömürlü olma eğilimindedir, ama bazen kısa ömürlü bir nesne ya da bağımlılık oluşturmak için bir değeri yalnızca çalışma zamanında bilinen temel gerekir.
Daha fazla bilgi için this bkz.
Sadece Son Sorumlu şu Anda oluştur
Nesneler sonuna kadar ayrılmış tutmak. Normalde, her şey uygulamanın giriş noktası bekle havale yapabilirsin. Bu denirKompozisyon Kök.
Daha fazla detay:
- Where should I do Injection with Ninject 2 (and how do I arrange my Modules?)
- Design - Where should objects be registered when using Windsor
Bir Cephe kullanarak kolaylaştırmak
Eğer sonuç API acemi kullanıcılar için çok karmaşık olduğunu düşünüyorsanız, her zaman ortak bağımlılık kombinasyonu saklanması Facade birkaç sınıfları sağlayabilir.
Bulunabilmesinin yüksek derecede esnek bir Cephe sağlamak için, Akıcı İnşaatçılar sağlayan düşünebiliriz. Şöyle bir şey:
public class MyFacade
{
private IMyDependency dep;
public MyFacade()
{
this.dep = new DefaultDependency();
}
public MyFacade WithDependency(IMyDependency dependency)
{
this.dep = dependency;
return this;
}
public Foo CreateFoo()
{
return new Foo(this.dep);
}
}
Bu bir kullanıcı yazarak varsayılan bir Foo oluşturmak için izin verecek
var foo = new MyFacade().CreateFoo();
Ancak, özel bir bağımlılık kaynağı olduğunu çok keşfedilebilir olacağını, ve yazabilirsiniz
var foo = new MyFacade().WithDependency(new CustomDependency()).CreateFoo();
Eğer MyFacade sınıfı farklı bağımlılıkları bir sürü kapsüller de ne yaptığını hala kullanildigini bulunabilir yaparken uygun varsayılanları nasıl sağlayacağını açıktır diye umuyorum.
FWIW, bu kadar uzun cevap yazdıktan sonra, kavram burada, üzerine genişletilmiş ve DI-Friendly Libraries DI-Friendly Frameworks arkadaşı hakkında bir yazı hakkında uzun bir blog yazısı yazdı.
Nasıl "Bağımlılık Enjeksiyon"...
Bağımlılık enjeksiyon nedir?...
Nasıl&; Bobby Tablolar" quot; xkcd...
Bağımlılık Enjeksiyon vs Fabrika Desen...
maven bağımlılık-eklentisi (gol "...