Enterprise Library Unity ve Diğer IoC Konteynerleri [kapalı]


135

Enterprise Library Unity ile diğer IoC kaplarını (Windsor, Spring.Net, Autofac ..) kullanmanın avantajları ve dezavantajları nelerdir?


9
Bu tür sorular her zaman kapalıdır. Görüşler önemlidir. Yerleştirilecek bir yer var mı?
Jeson Martajaya

1
@JesonMartajaya, ben tam olarak aynı yorumu övmek istedim, soruların kapanması can sıkıcı, ama bir alternatif için cevap yok.
Mohammed Noureldin

Yanıtlar:


234

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:

  • Başlatma
  • Nesne alma

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:

Ninject

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()
                    ));

StructureMap

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>();
 });

Birlik

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>();

Spring.NET

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 .

Windsor

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");

Autofac

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


1
Yalnızca Xml yapılandırması, yapılandırılmasını çok daha zor hale getirir. Temel olarak, Spring.Net'i kullanmak isteyen gördüğüm tek kişi eski Java geliştiricileri.
Chris Brandsma

Chris, sonuçlarınızla ilgili olarak: lütfen a) hangi C # 3 özelliklerinden bahsettiğinizi ve b) ne tür başlatmalar için önemli olduğunuzu biraz daha ayrıntılı olarak açıklayabilir misiniz? Teşekkürler!
Nicholas Blumhardt

2
Merhaba Nicholas: C # 3 desteğine gelince, Autofac'ın zaten yaptığı her şey. :) Başlatma için, singletons / singleton olmayanlar ve oturum başına başlatma için kolay destek istiyorum. Son olarak, özel adla başvurmak için kolay yollar istiyorum. (StructureMap'te PITA olan bir şey). Şimdi orijinal olarak yazdığım zamandan daha fazla sevdiğim son özellik: AutoMocking. Ben her zaman kullanmıyorum, ama hoşlanmak çok güzel.
Chris Brandsma

MEF'den de bahsettiniz, IRepository uygulama nesnelerimi teslim etmek ve işe yaradığını bulmak için MEF kullanıyorum. MEF hakkındaki düşünceleriniz neler?
terjetyl

İşte Unity'nin çoğunu sergileyen 20 dakikalık güzel bir screencast: pnpguidance.net/Screencast/…
Pat

7

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 .


4

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.


3

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ı


2

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.



1

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.


1

Ş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ı?


Uyarı için teşekkürler! Bahsettiğiniz sorunun bu cevabına göre , hata şimdi çözüldü.
Sam

Unity neden bir istisna atıyor? Genellikle bir istisna 'kritik bir hata' (çözülemez bağımlılık gibi) ve bastırılacak bir şey değil ..
user2864740

Affedersiniz, bu "hata" çözüldü mü veya bundan kaçınmanın bir yolunu buldunuz mu? Şimdi c # .net çerçeve seçiyorum ve birlik hala maliyet hala olup olmadığını bilmek için istekli ...
Jog Dan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.