SORU
12 Ocak 2010, Salı


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
12 Ocak 2010, Salı


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:

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ı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • Klemens Torggler

    Klemens Torg

    11 Mart 2008
  • theKGB65

    theKGB65

    24 Aralık 2007