Enterprise Library Unity ile diğer IoC kaplarını (Windsor, Spring.Net, Autofac ..) kullanmanın avantajları ve dezavantajları nelerdir?
Enterprise Library Unity ile diğer IoC kaplarını (Windsor, Spring.Net, Autofac ..) kullanmanın avantajları ve dezavantajları nelerdir?
Yanıtlar:
Bir kullanıcı grubu için sunum hazırlıyorum. Bu nedenle, sadece bir gruptan geçtim. Yani: AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity ve Windsor.
% 90 vakasını göstermek istedim (çoğunlukla enjeksiyon için IOC'yi kullanan şey olan yapıcı enjeksiyonu). Çözümü buradan kontrol edebilirsiniz (VS2008)
Bu nedenle, birkaç önemli fark vardır:
Her birinin başka özellikleri de var (bazılarının AOP ve daha iyi gizmosları var, ancak genellikle bir IOC'nin yapmasını istediğim tek şey benim için nesne oluşturmak ve almak)
Not: Farklı kitaplıklar nesne alımı arasındaki farklar CommonServiceLocator kullanılarak reddedilebilir: http://www.codeplex.com/CommonServiceLocator
Bu bizi başlatma yoluyla bırakır, bu da iki şekilde yapılır: kod veya XML yapılandırması (app.config / web.config / custom.config). Bazıları her ikisini de, bazıları sadece birini destekler. Şunu not etmeliyim: Bazıları IoC'ye yardımcı olmak için nitelikleri kullanır.
İşte farkları değerlendirmem:
Yalnızca kod başlatma (özniteliklerle). Umarım lambdaları seversin. Başlatma kodu şöyle görünür:
IKernel kernel = new StandardKernel(
new InlineModule(
x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
Başlatma kodu veya XML veya Nitelikler. v2.5 de çok lambda'y. Sonuçta, bu benim favorilerimden biri. StructureMap'in Nitelikleri nasıl kullandığı hakkında bazı ilginç fikirler.
ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile = false;
x.ForRequestedType<ICustomerRepository>()
.TheDefaultIsConcreteType<CustomerRepository>()
.CacheBy(InstanceScope.Singleton);
x.ForRequestedType<ICustomerService>()
.TheDefaultIsConcreteType<CustomerService>()
.CacheBy(InstanceScope.Singleton);
x.ForConcreteType<Form1>();
});
Başlatma kodu ve XML. Güzel kütüphane, ancak XML yapılandırması popodaki bir acıdır. Microsoft veya otoyol dükkanları için harika bir kütüphane. Kodun başlatılması kolaydır:
container.RegisterType<ICustomerRepository, CustomerRepository>()
.RegisterType<ICustomerService, CustomerService>();
XML sadece anlatabildiğim kadar yakın. Ancak işlevsellik için Spring.Net, bir IoC'nin yapabileceği her şeyi güneş altında yapar. Ancak, birimleştirmenin tek yolu XML yoluyla olduğundan, genellikle .net mağazaları tarafından önlenir. Yine de, birçok .net / Java mağazası, Spring.Net'in .net sürümü ile Java Spring projesi arasındaki benzerlik nedeniyle Spring.Net'i kullanır.
Not : Koddaki yapılandırma artık Spring.NET CodeConfig uygulamasıyla mümkündür .
XML ve kod. Spring.Net gibi Windsor da yapmasını istediğiniz her şeyi yapacaktır. Windsor muhtemelen etrafındaki en popüler IoC konteynerlerinden biridir.
IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");
Hem XML hem de kodu karıştırabilir (v1.2 ile). Güzel basit IoC kütüphanesi. Çok fazla yaygara ile temelleri yapmak gibi görünüyor. Yerel bileşen kapsamı ve iyi tanımlanmış bir yaşam süresi yönetimi ile iç içe geçmiş kapsayıcıları destekler.
İşte nasıl başlatırsınız:
var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
.As<ICustomerRepository>()
.ContainerScoped();
builder.Register<CustomerService>()
.As<ICustomerService>()
.ContainerScoped();
builder.Register<Form1>();
Bugün seçmek zorunda olsaydım: YapıMap ile giderdim. C # 3.0 dil özellikleri için en iyi desteğe ve başlatma sırasında en fazla esnekliğe sahiptir.
Not : Chris Brandsma orijinal cevabını bir blog yazısına dönüştürdü .
Gördüğüm kadarıyla, burada ve orada birkaç uygulama ayrıntısı dışında, hemen hemen aynılar. Unity'nin rekabete göre en büyük avantajı Microsoft tarafından sağlanmış olması, orada OSS'den korkan birçok şirket var.
Bir dezavantaj, oldukça yeni olmasıdır, bu nedenle eski oyuncuların zaten çözdüğü hatalara sahip olabilir.
Bunu söyledikten sonra, bunu kontrol etmek isteyebilirsiniz .
Eski iş parçacığı ama springnet vs birlik yazdığımda Google bana gösterdiğim ilk şey olduğundan ...
XML yapılandırmasını sevmiyorsanız Spring artık CodeConfig yapıyor
http://www.springframework.net/codeconfig/doc-latest/reference/html/
Ayrıca, Spring sadece bir DI konteynerinden çok daha fazlasıdır, eğer dokümanlardaki 'Modüller' bölümüne bakarsanız, DI konteyneri yaptığı büyük şeylerin temelini oluşturur.
Yanılıyorsam düzelt ama Autofac'ın kendisi bu bağlantıda listelenen XML Yapılandırmasını destekliyor: Autofac XML Yapılandırması
Yay, parametre adına veya konumuna göre yapıcıya veya özelliğe parametreler enjekte edebilen bir özelliğe sahiptir. Parametre veya özellik basit bir türse (örn. Bir tam sayı, bir boole) çok yararlıdır. Buradaki örneğe bakın . Bu gerçekten Spring'in kod yapılandırması yapamamasını oluşturduğunu sanmıyorum.
Windsor da bunu yapabilir ve yapılandırma kodu değil yapabilirsiniz. (yanılıyorsam beni düzeltin, burada duyduklarımdan geçiyorum).
Unity'nin bunu yapıp yapamayacağını bilmek istiyorum.
Dikkat edilmesi gereken bir nokta: Ninject, bağlamsal bağımlılık enjeksiyonlarını (web sitelerine göre) destekleyen tek IoC kapsayıcısıdır. Ancak, diğer IoC kapları ile deneyimim olmadığından, bunun geçerli olup olmadığını söyleyemem.
Sadece 2 sent eklemek için, StructureMap ve Unity'yi denedim. StructureMap'in kötü / yanlış yönlendirilmiş olduğunu, yapılandırılacak poponun bir ağrısını ve kullanmak için tıkandığını buldum. Aynı şekilde, benim için önemli bir kullanım noktası olan çözümleme zamanında yapıcı argümanı geçersiz kılmaları gibi senaryoları desteklemiyor gibi görünüyor. Bu yüzden düşürdüm ve Unity ile gittim ve yaklaşık 20 dakika içinde istediğimi yaptım.
Şahsen Unity'yi kullanıyorum, ancak sadece Microsoft'tan olduğu için. Bir nedenden ötürü karardan pişmanlık duyuyorum: aleyhindeki en büyük şeyin sürekli istisnalar atmasına neden olan büyük bir "hata" var. Hata ayıklama sırasında istisnaları yoksayabilirsiniz. Bununla birlikte , bir istisna atmak pahalı bir işlem olduğu için , uygulamanızda uygulamanızı muazzam bir şekilde yavaşlatır . Örneğin, şu anda bu istisnayı kodumda Unity'nin istisnalarının bir sayfanın oluşturma süresine fazladan 4 saniye eklediği bir noktada "düzeltiyorum" . Daha fazla ayrıntı ve geçici bir çözüm için bkz:
Unity her zaman SynchronizationLockException özel durumu oluşturmaz mı?