DI 용 Ninject vs Unity [닫기]


104

우리는 ASP.net MVC를 사용하고 있습니다.

다음 중 최고의 DI 프레임 워크 Ninject 또는 Unity는 무엇이며 그 이유는 무엇입니까?


94
NInject는 웹 사이트에서 멋진 브랜드 자석을 구입할 수 있기 때문에 더 좋습니다.
Ivan G.

5
일부 사람들이 유용하다고 생각하는이 질문의 업데이트 된 버전 (어쨌든 매우 유사 함) : stackoverflow.com/questions/4581791/…
Jason Down

답변:


46

지난번에 둘 중 하나를봤을 때 Ninject가 약간 더 나은 것으로 나타났습니다. 그러나 둘 다 단점이 있습니다.

Ninject는 더 나은 유창한 구성 체계를 가지고 있습니다. Unity는 대부분 XML 구성에 의존하는 것 같습니다. Ninject의 주요 단점은 [Inject] 속성을 추가하기 위해 코드의 모든 곳에서 Ninject.Core를 참조해야한다는 것입니다.

내가 물어 보면, 왜이 두 가지 선택을 제한하는 거죠? Castle.Windsor, Autofac 및 StructureMap이 적어도 그 이상이라고 생각합니다.


47
생성자가 두 개 이상이고 사용할 생성자를 Ninject에 알려야하는 경우에만 Inject 특성을 사용하면됩니다. 기본적으로 가장 많은 수의 매개 변수가있는 생성자를 사용합니다.
Jeffrey Cameron

11
그 동안 공식 Ninject.Web.Mvc 확장도 있습니다. NinjectHttpApplication에서 파생되도록 MvcApplication을 변경하고 커널을 회전시키고 RegisterAllControllersIn (Assembly.GetExecutingAssembly ())을 호출하여 주어진 어셈블리의 모든 컨트롤러를 처리합니다. 마법.
Michael Stum

18
이 답변은 이제 Ninject 2에 대한 reagrd와는 무관합니다. Ninject 1에 대한 불만은 합법적이지만 Ninject 2는 속성이있는 클래스를 흩뿌 리지 않고 작업 할 수 있도록합니다. ninject2는 클래스를 수정할 필요없이 투명하게 작동합니다.
chillitom

3
이 시점 (v3.0.1304.1)에서 코드를 통해 완전히 구성 할 수있는 것처럼 보이기 때문에 Unity도 동일합니다.
Eric

46

나는 이것이 오래된 질문이라는 것을 알고 있지만 여기에 내 생각이 있습니다.

저는 개인적으로 Ninject를 좋아합니다. 나는 유창한 인터페이스와 XML을 피하는 것을 좋아합니다. 나는 일반적으로 XML을 좋아하지만 이러한 종류의 구성에 대해서는 그렇지 않습니다. 특히 리팩토링이 관련 될 때 유창한 인터페이스로 인해 수정하기가 더 쉽습니다.

StructureMap의 ObjectFactory가 그립지 만 Ninject에 추가하는 쉬운 해결 방법이 있습니다.

Jeffery가 지적했듯이 생성자가 하나 뿐인 경우 [Inject] 속성을 사용할 필요가 없습니다.

나는 유창한 인터페이스가 XML을 피할뿐만 아니라 영향을주는 것을 변경할 때 컴파일 시간 오류를 발생시키기 때문에 선호한다는 것을 발견했습니다. XML 구성은 그렇지 않으며 변경 해야 할 기억 이 적을 수록 더 좋습니다.


10

Ninject는 주입 기술에 관계없이 디버그하기 매우 어려운 StackOverflowException을 발생시키는 Unity와 달리 주입 생성자를 사용하는 경우 순환 종속성을 감지합니다.


9

나는 Mendelt에 동의하며 "최고의"DI 프레임 워크는 없습니다. 상황에 따라 다르며 모두 장단점이 있습니다. David Hayden이 DotNet Rocks에서 EntLib의 나머지를 사용하고 그것에 익숙하다면 Unity가 선호되는 선택이라고 말했습니다. 제 고객 이 DLL에 Microsoft Enterprise Library (Unity) 라고 말하는 것을 좋아하기 때문에 저는 개인적으로 Unity를 사용 합니다.

인터페이스와 구체적인 구현을 설정하기 위해 xml 구성을 모두 사용하지만 다음과 같이 삽입 할 때 코드에서 속성을 사용합니다.

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

그리고 코드에서 :

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

개인적으로 나는 그것이 무슨 일이 일어나는지 더 명확하게 만든다고 생각하지만, 물론 당신은 당신의 응용 프로그램 전체에 통합에 대한 참조를 가질 것이라고 주장 할 수 있습니다. 그것은 당신에게 달려 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.