문제

Enterprise Library Unity vs 기타 IOC 컨테이너 (Windsor, Spring.net, Autofac ..) 사용의 장단점은 무엇입니까?

도움이 되었습니까?

해결책

사용자 그룹을위한 프레젠테이션을 준비하고 있습니다. 따라서 나는 방금 그들을 겪었다. 즉, 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는 또한 매우 Lambda'y입니다. 대체로 이것은 내가 가장 좋아하는 것 중 하나입니다. 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 또는 Highway Shops를위한 훌륭한 도서관. 코드 초기화는 쉽습니다.

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

Spring.net

내가 말할 수있는 한 xml 만 거의 가까이에 있습니다. 그러나 기능을 위해 Spring.net은 IOC가 할 수있는 태양 아래 모든 것을 수행합니다. 그러나 유니터링하는 유일한 방법은 XML을 통한 것이기 때문에 일반적으로 .NET 상점은 피합니다. 그러나 많은 .NET/Java Shop은 Spring.net의 .NET 버전과 Java Spring Project의 유사성 때문에 Spring.net을 사용합니다.

메모: 코드의 구성은 이제 Spring.net CodeConfig.

윈저

XML 및 코드. Spring.net과 마찬가지로 Windsor는 원하는 것을 할 수 있습니다. Windsor는 아마도 가장 인기있는 IOC 컨테이너 중 하나 일 것입니다.

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

Autofac

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

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

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

내가 오늘 선택해야한다면 : 아마 구조 맵과 함께 갈 것입니다. C# 3.0 언어 기능과 초기화에서 가장 유연성을 지원합니다.

메모: Chris Brandsma는 그의 원래 대답을 a로 바꿨습니다 블로그 게시물.

다른 팁

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

한 가지 단점은 다소 새로운 것이므로 오래된 플레이어가 이미 분류 한 버그가있을 수 있다는 것입니다.

그렇게 말했듯이, 당신은 원할 수도 있습니다 이것 좀 봐.

오래된 스레드이지만 Unity vs Spring.net을 입력했을 때 Google이 저에게 가장 먼저 보여준 것이기 때문에 ...

XML Config가 마음에 들지 않으면 Spring이 CodeConfig를 수행합니다.

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

또한 스프링은 DI 컨테이너 이상의 것이므로 문서의 '모듈'섹션을 보면 DI 컨테이너는 큰 일의 거대한 스택의 기초입니다.

내가 착각하면 나를 수정하지만 AutoFac 자체 가이 링크에 나열된 XML 구성을 지원한다고 생각합니다. AutoFac XML 구성

Spring에는 매개 변수 이름 또는 위치에 따라 매개 변수를 생성자 또는 속성에 주입 할 수있는 기능 중 하나가 있습니다. 이것은 매개 변수 또는 속성이 간단한 유형 (예 : 정수, 부울) 인 경우에 매우 유용합니다. 보다 여기에 예. 나는 이것이 실제로 코드에서 구성 할 수 없다고 생각하지 않습니다.

Windsor는 또한이를 수행 할 수 있으며 구성이 아닌 코드로 수행 할 수 있습니다. (내가 틀렸다면 나를 바로 잡으십시오. 나는 여기서 들었던 것을 통해 가고 있습니다).

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

주목할만한 점 : Nineject는 웹 사이트에 따라 상황에 따라 의존성 주입을 지원하는 유일한 IOC 컨테이너입니다. 그러나 다른 IOC 컨테이너에 대한 경험이 없기 때문에 그것이 유지되는지 알 수 없습니다.

2 센트를 추가하기 위해 구조 맵과 통일을 모두 시도했습니다. 나는 구조가 잘못/잘못 문서화되고, 엉덩이에 통증이 있고, 구성하기에 어리석은 것을 발견했습니다. 마찬가지로, 생성자 인수와 같은 시나리오가 해상도 시간에 무시하는 것과 같은 시나리오를 지원하지 않는 것 같습니다. 이는 나에게 중요한 사용 지점이었습니다. 그래서 나는 그것을 떨어 뜨리고 Unity와 함께 갔고 약 20 분 안에 원하는 것을하고있었습니다.

나는 개인적으로 Unity를 사용하지만 Microsoft 출신이기 때문입니다. 나는 한 가지 이유에 대한 결정을 후회합니다. 그것에 대항하는 가장 큰 것은 하나의 큰 "버그"가있어서 그것을 끊임없이 예외를 던지게합니다. 디버깅하는 동안 예외를 무시할 수 있습니다. 그러나 응용 프로그램이 느려집니다 엄청나게 당신이 그것을 가로 질러 달리면, 예외를 던지기 때문에 비싼 작업이기 때문입니다. 예를 들어, 나는 현재 코드의 한 지점 에서이 예외를 "수정"하고 있습니다. 4 초 페이지의 렌더링 시간으로. 자세한 내용과 해결 방법은 다음을 참조하십시오.

동기화 lockexception을 항상 던지지 않도록 Unity를 만들 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top