Enterprise Library Unity와 다른 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도 매우 람다. 대체로 이것은 내가 가장 좋아하는 것 중 하나입니다. 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 언어 기능을 가장 잘 지원하고 초기화 유연성이 가장 뛰어납니다.
답변
내가 본 한, 여기저기서 구현 세부 사항을 제외하고는 거의 동일합니다. Unity가 경쟁 업체에 비해 가장 큰 장점은 Microsoft가 제공한다는 점입니다. OSS를 두려워하는 많은 회사가 있습니다.
한 가지 단점은 새로운 것이기 때문에 구형 플레이어가 이미 분류 한 버그가있을 수 있다는 것입니다.
그렇게 말한 후에 이것을 확인 하고 싶을 수도 있습니다 .
답변
오래된 스레드이지만 이것이 unity vs spring.net을 입력했을 때 Google이 가장 먼저 보여준 것입니다 …
XML 설정이 마음에 들지 않으면 Spring은 이제 CodeConfig를 수행합니다.
http://www.springframework.net/codeconfig/doc-latest/reference/html/
또한 Spring은 단순한 DI 컨테이너 그 이상입니다. 문서에서 ‘모듈’섹션을 보면 DI 컨테이너가 수행하는 거대한 스택의 기초입니다.
답변
내가 틀렸지 만 Autofac 자체가 다음 링크에 나열된 XML 구성을 지원한다고 생각합니다 : Autofac XML 구성
답변
Spring에는 매개 변수 이름 또는 위치에 따라 생성자 또는 특성에 매개 변수를 삽입 할 수있는 기능이 있습니다. 매개 변수 또는 특성이 단순 유형 (예 : 정수, 부울) 인 경우 매우 유용합니다. 여기의 예를 참조 하십시오 . 이것이 스프링이 코드에서 구성을 수행 할 수 없다는 것을 실제로는 생각하지 않습니다.
Windsor는이 작업을 수행 할 수 있으며 구성하지 않은 코드에서 수행 할 수 있습니다. (내가 틀렸다면 정정하십시오, 나는 내가 들었던 것을 통해 가고 있습니다).
Unity가 이것을 할 수 있는지 알고 싶습니다.
답변
주목할 사항 : Ninject는 웹 사이트에 따라 상황에 따른 의존성 주입을 지원하는 유일한 IoC 컨테이너입니다. 그러나 다른 IoC 컨테이너에 대한 경험이 없으므로 보유 여부를 알 수 없습니다.
답변
내 2 센트를 추가하기 위해 StructureMap과 Unity를 모두 시도했습니다. StructureMap이 잘못 / 잘못 문서화되어 있고, 구성하기가 쉽지 않고, 사용하기 불편한 것을 발견했습니다. 마찬가지로 해결 시간에 생성자 인수 재정의와 같은 시나리오를 지원하지 않는 것 같습니다. 이는 주요 사용 지점이었습니다. 그래서 나는 그것을 떨어 뜨리고 Unity와 함께 갔으며 약 20 분 안에 원하는 일을했습니다.