Ninject vs Unity for DI [zamknięte]

104

Używamy ASP.net MVC.

Który z nich jest najlepszym frameworkiem DI Ninject lub Unity i dlaczego?

Miral
źródło
94
NInject jest lepszy, ponieważ możesz kupić fajne markowe magnesy na ich stronie internetowej.
Ivan G.
5
Zaktualizowana wersja tego pytania (w każdym razie bardzo podobna), która może być przydatna dla niektórych osób: stackoverflow.com/questions/4581791/…
Jason Down

Odpowiedzi:

46

Ostatnim razem, gdy spojrzałem na którykolwiek z nich, znalazłem Ninject trochę lepiej. Ale obie mają swoje wady.

Ninject ma lepszy schemat płynnej konfiguracji. Wydaje się, że Unity polega głównie na konfiguracji XML. Główną wadą Ninject jest to, że wymaga on odwoływania się do Ninject.Core w każdym miejscu w kodzie, aby dodać atrybuty [Inject].

Jeśli mogę zapytać, dlaczego ograniczasz swoje wybory do tych dwóch? Myślę, że Castle.Windsor, Autofac i StructureMap są co najmniej tak samo dobre lub lepsze.

Mendelt
źródło
47
Musisz użyć atrybutu Inject tylko wtedy, gdy istnieje więcej niż jeden konstruktor i musisz powiedzieć Ninject, którego konstruktora użyć. Domyślnie używa konstruktora z największą liczbą parametrów.
Jeffrey Cameron
11
W międzyczasie dostępne jest również oficjalne rozszerzenie Ninject.Web.Mvc. Zmieniasz MvcApplication, aby pochodziła z NinjectHttpApplication, uruchom w nim Kernel i wywołaj RegisterAllControllersIn (Assembly.GetExecutingAssembly ()), aby zajął się wszystkimi kontrolerami w danym zestawie. Magia.
Michael Stum
18
Ta odpowiedź jest teraz zupełnie nieistotna w przypadku reagrd do Ninject 2. Podczas gdy skarga była uzasadniona dla Ninject 1, Ninject 2 pozwala na pracę bez zaśmiecania tam klas atrybutami. ninject2 będzie działał transparentnie, bez konieczności modyfikowania twoich klas.
chillitom
3
To samo dotyczy jedności, ponieważ wydaje się, że w tym momencie można go całkowicie skonfigurować za pomocą kodu (wersja 3.0.1304.1)
Eric
46

Wiem, że to stare pytanie, ale oto moje myśli:

Osobiście lubię Ninject. Lubię płynne interfejsy i unikanie XML. Generalnie lubię XML, ale nie do tego rodzaju konfiguracji. Zwłaszcza w przypadku refaktoryzacji płynne interfejsy ułatwiają poprawianie.

Brakuje mi ObjectFactory StructureMap, ale są łatwe obejścia, aby dodać to do Ninject.

Jak zauważa Jeffery, nie musisz używać atrybutu [Inject], gdy masz tylko jednego konstruktora.

Odkryłem, że wolę płynne interfejsy nie tylko dlatego, że unikają XML, ale dlatego, że powodują błędy czasu kompilacji, gdy zmieniam coś, co ich dotyczyło. Konfiguracja XML nie działa, a im mniej muszę pamiętać, aby zmienić, tym lepiej mam.

roberocity
źródło
10

Ninject wykrywa zależności cykliczne, jeśli używasz konstruktorów iniekcji w przeciwieństwie do Unity, które niezależnie od techniki iniekcji po prostu zgłasza StackOverflowException, który jest niezwykle trudny do debugowania.

IMLiviu
źródło
9

Zgadzam się z Mendeltem, nie ma „najlepszego” schematu DI. Zależy to tylko od sytuacji i wszyscy mają wady i zalety. myślę, że David Hayden powiedział w DotNet Rocks, że Unity jest preferowanym wyborem, jeśli używasz reszty EntLib i znasz to. Osobiście używam Unity, ponieważ mojemu klientowi podoba się fakt, że mówi on o Microsoft Enterprise Library (Unity) w bibliotekach DLL, jeśli rozumiesz to, co mówię.

Używam zarówno konfiguracji XML do konfigurowania interfejsów, jak i ich konkretnych implementacji, ale potem używam atrybutów w kodzie podczas wstrzykiwania, takich jak:

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

iw kodzie:

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

Osobiście uważam, że to wyjaśnia, co się dzieje, ale oczywiście można argumentować, że w całej aplikacji będą występowały odniesienia do jedności. To zależy od Ciebie.

Johan Leino
źródło