2009-11-11 12 views

cevap

15

Kontrol

hızlı bir özeti ters çevrilmesi (çok daha fazla okuma Bu konuyu mevcuttur ve ben çok daha okumanızı öneririz) ... dahil

Microsoft'un Enterprise Patterns and Practices ekibinden Birlik, bir Kontrol konteynırı projesi veya kısaca IoC'dir. Tıpkı Castle Windsor, StructureMap, vb. Gibi. Bu tür geliştirme, lamen'in bileşenlerinizi gevşekçe kavraması olarak da ifade edilir.

IoC, nesnelerinizin içindeki bağımlılıkları bağlamak için harici bir bileşene güvenebileceğiniz nesnelerin Bağımlılık Enjeksiyonu için bir model içerir. Örneğin, statik yöneticilere erişmek yerine (birim testinin neredeyse imkansız olduğu), harekete geçmek için bir dış bağımlılığa dayanan bir nesne yaratırsınız. Bir Posta almak için DB'ye erişmek istediğiniz Post hizmetini ele alalım.

public class PostService : IPostService 
{ 
    private IPostRepository _postRepo; 

    public PostService(IPostRepository postRepo) 
    { 
    _postRepo = postRepo; 
    } 

    public IList<Post> GetPosts() 
    { 
    return _postRepo.GetAllPosts().ToList(); 
    } 
} 

Bu PostService nesnesi, IPostRepository üzerinde artık harici bir bağımlılığa sahiptir. Hiçbir betonun ve statik yönetici sınıfının kullanılmadığına dikkat edin?Bunun yerine, basit bir Arabirimin gevşek kaplinli bağlantısına sahip olursunuz - bu da size IPostRepository'yi uygulayan tüm farklı türde beton sınıflarının kablolanmasını sağlar.

Microsoft Unity'nin amacı, sizin için otomatik olarak IPostRepository'yi kurmaktır. Yani yapmayı derdiniz yok:

// you never have to do this with Unity 
IPostRepository repo = new PostRepository(); 
IPostService service = new PostService(repo); // dependency injection 
IList<Post> posts = service.GetPosts(); 

Eğer PostRepository() ve POSTSERVICE() iki beton sınıfları uygulamak zorunda yukarıdaki gösterir. Bu, uygulamanızı bu kesin örnekleri talep etmek/talep etmek için sıkı bir şekilde birleştirir ve ünite testine çok zor bırakır.

Bunun yerine, bitiş noktası (ASPX sayfalarında arkasında MVC kontrolör veya kodu) içinde Unity kullanırsınız:

IUnityContainer ioc = new UnityContainer(); 
IPostService postService = ioc.Resolve<IPostService>(); 
IList<Post> posts = postService.GetPosts(); 

UnityContainer ve mesaj dışında (bu örnekte kullanılan hiçbir beton vardır Bildirimi olduğunu Açıkçası)! Hizmetlerin betonu yok ve depo yok. Bu, en ince ayrıntısına gevşek bir şekilde bağlanıyor.

İşte ...

Unity gerçek şikâyetçi olduğunu (ya orada herhangi IoC konteyner çerçevesini!) Herhangi bağımlılıkları için IPostService denetleyecek. Bir IPostRepository örneğinde olmasını ister (değişecektir). Yani, Birlik onun nesne haritasına girecek ve kapta kayıtlı olan IPostRepository'i uygulayan ve onu iade eden ilk nesneyi arayacaktır (yani bir SqlPostRepository örneği). Bu, IoC çerçevelerinin ardındaki gerçek güçtür - hizmetleri denetleme ve bağımlılıkları otomatik olarak kurma yetkisi.

Blog yazımı, UNity ve Castle vs StructureMap karşılaştırmaları hakkında bitirmem gerekiyor. Ben aslında konfigürasyon dosya seçenekleri ve genişletilebilirlik noktaları nedeniyle Castle Windsor'u tercih ederim.

+1

+1 - güzel yanıt! Unity'yi kullanıyorum. – TrueWill

+1

+1 - iyi cevap! –

+0

Teşekkürler çocuklar. Yıllar geçtikçe (wow, bu cevabı yayınladığımdan 2 yıl sonra) aslında Castle Windsor'dan uzaklaşmaya başladım çünkü "Resolve () 'u çağırırsanız, Release (Object)" öğesini çağırmalısınız. "Bu bir hata değil." ama bir özellik "sorunu. Bu, yazdığım uygulamalarda bir dizi bellek sızıntısına neden oldu. Bunun yerine, WebRequests özel bir bağlamsal işleme ile MEF'ye taşınıyorum. – eduncan911

4

Birlik Uygulama Bloğu, dependency injection için kullanılır. Sana sorunlara neden olabilir, sen gidip kendiniz buzdolabından bir şeyler olsun DI iyi basit tanımı this question

den olduğunu düşünüyorum. Kapıyı açık bırakabilirsin, annen ya da babanın sahip olmanı istemediği bir şey elde edebilirsin. Hatta sahip olmadığımız veya süresi dolmuş bir şey arıyor olabilirsiniz.

Yapmanız gereken şey, "Öğle yemeği ile içmek için bir şeye ihtiyacım var" diyen bir ihtiyaç olduğunu belirtmek ve sonra yemek için oturduğunuzda bir şey aldığınızdan emin olacağız. Biz Bağımlılık olarak Drink tanımlanan çünkü örneğin Yani

,

IUnityContainer container = new UnityContainer(); 
ILunch lunch = container.Resolve<ILunch>(); 
Console.WriteLine(lunch.Drink); 

Bu "limonata" çıktılar. Diğer nesneler üzerinde bağımlılıklar varsa ve geliştirici manuel olarak ayarlamak zorunda kalmak istemiyorsanız

public class ILunch { 
    [Dependency] 
    public IDrink Drink { get; set; } 
} 

Bildiğim kadarıyla pratiklik giderse, Bağımlılık Enjeksiyon gerçekten harika. Bu kadar basit. Aynı zamanda alay etmek için de harika. Kullandığım en çok kullanılan örnek bir veri katmanı ile alay ediyor. Bazen veritabanı hazır değil, gelişmeyi durdurmak yerine sahte verileri veren sahte bir katman var. Veri nesnesine DI üzerinden erişilebilir ve sahte katmana veya gerçek katmana erişen nesneleri döndürecek şekilde yapılandırılabilir. Bu örnekte neredeyse DI Container'ı yapılandırılabilir bir fabrika sınıfı olarak kullanıyorum. Unity MSDN hakkında daha fazla bilgi için http://msdn.microsoft.com/en-us/library/cc468366.aspx bazı harika kaynaklara sahiptir.

Diğer iyi DI Çerçeveleri Spring.NET ve Ninject

İlgili konular