Enterprise Library Unity 및 기타 IoC 컨테이너 [닫기]


135

Enterprise Library Unity와 다른 IoC 컨테이너 (Windsor, Spring.Net, Autofac ..)를 사용할 때의 장단점은 무엇입니까?


9
이러한 유형의 질문은 항상 마감됩니다. 의견이 중요합니다. 그것들을 놓을 곳이 있습니까?
Jeson Martajaya

1
@ JesonMartajaya, 나는 똑같은 의견을 칭찬하고 싶었습니다. 질문이 닫히고 있지만 대안에 대한 답은 없다는 것이 짜증납니다.
Mohammed Noureldin

답변:


234

사용자 그룹을위한 프레젠테이션을 준비 중입니다. 그래서 나는 방금 그들 중 많은 것을 겪었습니다. 즉, AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity 및 Windsor입니다.

나는 90 %의 사례를 보여주고 싶었다 (주로 사람들이 IOC를 사용하는 생성자 주입). 여기에서 솔루션을 확인할 수 있습니다 (VS2008)

따라서 몇 가지 주요 차이점이 있습니다.

  • 초기화
  • 객체 검색

그들 각각은 다른 기능도 가지고 있습니다 (일부는 AOP와 더 나은 기즈모를 가지고 있지만 일반적으로 IOC 가하고 싶은 것은 나를 위해 객체를 만들고 검색하는 것입니다)

참고 : CommonServiceLocator를 사용하여 다른 라이브러리 오브젝트 검색의 차이점을 무시할 수 있습니다. http://www.codeplex.com/CommonServiceLocator

따라서 코드 또는 XML 구성 (app.config / web.config / custom.config)을 통해 초기화가 수행됩니다. 일부는 둘 다 지원하고 일부는 하나만 지원합니다. IoC를 돕기 위해 일부 속성을 사용합니다.

차이점에 대한 평가는 다음과 같습니다.

닌 젝트

코드 초기화 만 (속성 포함). 나는 당신이 람다를 좋아하기를 바랍니다. 초기화 코드는 다음과 같습니다.

 IKernel kernel = new StandardKernel(
                new InlineModule(
                    x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
                    x => x.Bind<ICustomerService>().To<CustomerService>(),
                    x => x.Bind<Form1>().ToSelf()
                    ));

구조도

초기화 코드 또는 XML 또는 속성. v2.5도 매우 람다. 대체로 이것은 내가 가장 좋아하는 것 중 하나입니다. StructureMap이 속성을 사용하는 방법에 대한 매우 흥미로운 아이디어.

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

단일성

초기화 코드 및 XML. 멋진 라이브러리이지만 XML 구성은 엉덩이에 어려움이 있습니다. Microsoft 또는 고속도로 상점을위한 훌륭한 라이브러리. 코드 초기화가 쉽습니다.

 container.RegisterType<ICustomerRepository, CustomerRepository>()
          .RegisterType<ICustomerService, CustomerService>();

Spring.NET

내가 알 수있는만큼만 XML. 그러나 Spring.Net은 IoC가 할 수있는 모든 일을 태양 아래서 수행합니다. 그러나 통합하는 유일한 방법은 XML을 통하는 것이므로 일반적으로 .net 상점에서는 피합니다. 많은 .net / Java 상점은 Spring.Net의 .net 버전과 Java Spring 프로젝트의 유사성 때문에 Spring.Net을 사용합니다.

참고 : Spring.NET CodeConfig를 도입하여 코드 구성이 가능해 졌습니다 .

윈저

XML과 코드. Spring.Net과 마찬가지로 Windsor는 원하는 모든 작업을 수행합니다. 윈저는 아마도 가장 유명한 IoC 컨테이너 중 하나 일 것입니다.

IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");

오토 팩

XML과 코드를 모두 혼합 할 수 있습니다 (v1.2 포함). 좋은 간단한 IoC 라이브러리. 소란스럽지 않은 기본 사항을 수행하는 것 같습니다. 구성 요소의 로컬 범위 지정 및 잘 정의 된 수명 관리를 통해 중첩 된 컨테이너를 지원합니다.

초기화 방법은 다음과 같습니다.

var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
        .As<ICustomerRepository>()
        .ContainerScoped();
builder.Register<CustomerService>()
        .As<ICustomerService>()
        .ContainerScoped();
builder.Register<Form1>();

오늘을 선택해야한다면 아마도 StructureMap을 사용할 것입니다. C # 3.0 언어 기능을 가장 잘 지원하고 초기화 유연성이 가장 뛰어납니다.

참고 : Chris Brandsma는 원래 답변을 블로그 게시물 로 바꿨 습니다 .


1
Xml 구성만으로 구성하기가 훨씬 어렵습니다. 기본적으로 Spring.Net을 사용하려는 유일한 사람들은 이전 Java 개발자입니다.
Chris Brandsma

Chris, 결론 : a) 참조하는 C # 3 기능 및 b) 어떤 초기화가 중요한지에 대해 좀 더 자세히 설명해 주시겠습니까? 감사!
Nicholas Blumhardt

2
안녕 니콜라스 : C # 3 지원에 관해서는 Autofac이 이미하는 모든 것을 지원합니다. :) 초기화를 위해 싱글 톤 / 비 싱글 톤 및 세션 당 초기화를 쉽게 지원하고 싶습니다. 마지막으로 사용자 정의 이름으로 쉽게 참조 할 수있는 방법을 원합니다. (StructureMap의 PITA). 내가 이것을 처음 쓸 때보 다 더 좋아하는 마지막 기능은 AutoMocking입니다. 나는 항상 그것을 사용하지는 않지만, arount를 갖는 것이 매우 좋습니다.
Chris Brandsma

MEF도 언급했으며 MEF를 사용하여 IRepository 구현 객체를 제공하고 제대로 작동한다는 것을 알았습니다. MEF에 대한 당신의 생각은 무엇입니까?
terjetyl

다음은 Unity의 대부분을 보여주는 멋진 20 분짜리 스크린 캐스트입니다. pnpguidance.net/Screencast/…
Pat

7

내가 본 한, 여기저기서 구현 세부 사항을 제외하고는 거의 동일합니다. Unity가 경쟁 업체에 비해 가장 큰 장점은 Microsoft가 제공한다는 점입니다. OSS를 두려워하는 많은 회사가 있습니다.

한 가지 단점은 새로운 것이기 때문에 구형 플레이어가 이미 분류 한 버그가있을 수 있다는 것입니다.

그렇게 말한 후에 이것을 확인 하고 싶을 수도 있습니다 .


4

오래된 스레드이지만 이것이 unity vs spring.net을 입력했을 때 Google이 가장 먼저 보여준 것입니다 ...

XML 설정이 마음에 들지 않으면 Spring은 이제 CodeConfig를 수행합니다.

http://www.springframework.net/codeconfig/doc-latest/reference/html/

또한 Spring은 단순한 DI 컨테이너 그 이상입니다. 문서에서 '모듈'섹션을 보면 DI 컨테이너가 수행하는 거대한 스택의 기초입니다.


3

내가 틀렸지 만 Autofac 자체가 다음 링크에 나열된 XML 구성을 지원한다고 생각합니다 : Autofac XML 구성


2

Spring에는 매개 변수 이름 또는 위치에 따라 생성자 또는 특성에 매개 변수를 삽입 할 수있는 기능이 있습니다. 매개 변수 또는 특성이 단순 유형 (예 : 정수, 부울) 인 경우 매우 유용합니다. 여기의 예를 참조 하십시오 . 이것이 스프링이 코드에서 구성을 수행 할 수 없다는 것을 실제로는 생각하지 않습니다.

Windsor는이 작업을 수행 할 수 있으며 구성하지 않은 코드에서 수행 할 수 있습니다. (내가 틀렸다면 정정하십시오, 나는 내가 들었던 것을 통해 가고 있습니다).

Unity가 이것을 할 수 있는지 알고 싶습니다.


2

주목할 사항 : Ninject는 웹 사이트에 따라 상황에 따른 의존성 주입을 지원하는 유일한 IoC 컨테이너입니다. 그러나 다른 IoC 컨테이너에 대한 경험이 없으므로 보유 여부를 알 수 없습니다.


이것이 모두 "문맥 의존성 주입" 이라면 Ninject에 있습니다. Unity, AutoFac, Windsor에서 (다양한 방법으로) 지원됩니다.
user2864740

1

내 2 센트를 추가하기 위해 StructureMap과 Unity를 모두 시도했습니다. StructureMap이 잘못 / 잘못 문서화되어 있고, 구성하기가 쉽지 않고, 사용하기 불편한 것을 발견했습니다. 마찬가지로 해결 시간에 생성자 인수 재정의와 같은 시나리오를 지원하지 않는 것 같습니다. 이는 주요 사용 지점이었습니다. 그래서 나는 그것을 떨어 뜨리고 Unity와 함께 갔으며 약 20 분 안에 원하는 일을했습니다.


1

개인적으로 Unity를 사용하지만 Microsoft에서 온 것이기 때문입니다. 한 가지 이유 때문에 결정을 후회합니다. 그에 대한 가장 큰 문제는 하나의 큰 "버그"가있어 계속 예외를 발생시킵니다. 디버깅하는 동안 예외를 무시할 수 있습니다. 그러나 예외를 던지면 비용이 많이 들기 때문에 애플리케이션 을 실행하면 애플리케이션 속도가 엄청나게 느려집니다 . 예를 들어, 현재 Unity의 예외가 페이지의 렌더링 시간에 4 초 를 더 추가하는 코드의 한 지점에서이 예외를 "고정"하고 있습니다. 자세한 내용과 해결 방법은 다음을 참조하십시오.

Unity가 SynchronizationLockException을 항상 발생시키지 않도록 할 수 있습니까?


경고 주셔서 감사합니다! 에서 언급 한 질문에 대한이 답변 에 따르면 버그가 해결되었습니다.
Sam

Unity가 예외를 던지나요? 보통 예외 .. 억제 할 수있는 (예 unreolveable 의존성과 같은) '중대 오류'가 아닌 무언가
user2864740

실례합니다,이 "버그"가 해결 되었습니까? 아니면 그것을 피할 수있는 방법을 찾았습니까? 나는 지금 C # .net에서 프레임 워크를 선택하고 있고 화합이 여전히 시간 비용인지 알고 싶어한다 ...
Jog Dan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.