DI için Ninject vs Unity [kapalı]


104

ASP.net MVC kullanıyoruz.

Bunlardan hangisi en iyi DI çerçevesi Ninject veya Unity'dir ve neden?


94
NInject daha iyidir çünkü web sitelerinden havalı markalı mıknatıslar satın alabilirsiniz.
Ivan G.

5
Bu sorunun bazı kişilerin yararlı bulabileceği güncellenmiş versiyonu (yine de çok benzer): stackoverflow.com/questions/4581791/…
Jason Down

Yanıtlar:


46

İkisine en son baktığımda Ninject'i biraz daha iyi buldum. Ancak ikisinin de dezavantajları var.

Ninject daha iyi bir akıcı konfigürasyon şemasına sahiptir. Unity, çoğunlukla XML yapılandırmasına dayanıyor gibi görünüyor. Ninject'in ana dezavantajı, [Inject] nitelikleri eklemek için kodunuzun her yerinde Ninject.Core'a başvurmanızı gerektirmesidir.

Sorabilirsem, neden seçimlerinizi bu ikisiyle sınırlıyorsunuz? Bence Castle.Windsor, Autofac ve StructureMap en az onun kadar iyi ya da daha iyi.


47
Yalnızca birden fazla kurucu varsa ve Ninject'e hangi kurucunun kullanılacağını söylemeniz gerekiyorsa, Inject niteliğini kullanmanız gerekir. Varsayılan olarak en çok sayıda parametreye sahip yapıcıyı kullanır.
Jeffrey Cameron

11
Bu arada, resmi bir Ninject.Web.Mvc uzantısı da var. MvcApplication'ınızı NinjectHttpApplication'dan türetecek şekilde değiştirirsiniz, içindeki Kernel'i döndürürsünüz ve verilen derlemedeki tüm denetleyicilerle ilgilenmesi için RegisterAllControllersIn (Assembly.GetExecutingAssembly ()) 'yi çağırırsınız. Büyü.
Michael Stum

18
Bu yanıt, Ninject 2'ye reagrd ile oldukça ilgisizdir. Şikayet Ninject 1 için meşru olsa da, Ninject 2 kişinin nitelikleri olan sınıfları doldurmadan çalışmasına izin verir. ninject2, sınıflarınızı değiştirmenize gerek kalmadan şeffaf bir şekilde çalışacaktır.
chillitom

3
Bu noktada kod aracılığıyla tamamen yapılandırılabilir göründüğü için birlik için aynı (v3.0.1304.1)
Eric

46

Bunun eski bir soru olduğunu biliyorum ama işte düşüncelerim:

Ben şahsen Ninject'i seviyorum. Akıcı arayüzleri ve XML'den kaçınmayı seviyorum. Genelde XML'i severim, sadece bu tür yapılandırma işleri için değil. Özellikle yeniden düzenleme söz konusu olduğunda, akıcı arayüzler düzeltmeyi kolaylaştırır.

StructureMap'in ObjectFactory'sini özlüyorum, ancak bunu Ninject'e eklemek için kolay çözümler var.

Jeffery'nin belirttiği gibi, yalnızca bir kurucunuz olduğunda [Enjekte] özelliğini kullanmak zorunda değilsiniz.

Akıcı arayüzleri sadece XML'den kaçındıkları için değil, onları etkileyen bir şeyi değiştirdiğimde derleme zamanı hatalarına neden oldukları için tercih ettiğimi fark ettim. XML yapılandırması olmuyor ve ne kadar az hatırlamam gerekiyorsa o kadar iyi durumdayım.


10

Enjeksiyon tekniğinden bağımsız olarak, hata ayıklaması son derece zor olan bir StackOverflowException oluşturan Unity'nin aksine Enjeksiyon Yapıcılarını kullanırsanız Ninject döngüsel bağımlılıkları algılar.


9

Mendelt'e katılıyorum, "en iyi" DI çerçevesi yok. Bu sadece duruma bağlıdır ve hepsinin artıları ve eksileri vardır. David Hayden, DotNet Rocks'ta EntLib'in geri kalanını kullanıyorsanız ve buna aşina iseniz Unity'nin tercih edilen seçenek olduğunu söyledi. Ben şahsen Unity kullanıyorum çünkü müşterim Microsoft DLL'lerde Enterprise Library (Unity) yazmasını , eğer söylediğimi anlarsanız.

Arayüzleri ve somut uygulamalarını kurmak için hem xml yapılandırmasını kullanıyorum, ancak daha sonra enjekte ederken kodda öznitelikleri kullanıyorum, örneğin:

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

ve kodda:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)

Şahsen ben bunun ne olduğunu daha net hale getirdiğini düşünüyorum, ancak elbette başvurunuzun her yerinde birliğe atıfta bulunacağınız iddia edilebilir. Sana kalmış.


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.