Enterprise Library Unity와 다른 IoC 컨테이너 (Windsor, Spring.Net, Autofac ..)를 사용할 때의 장단점은 무엇입니까?
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>();
내가 알 수있는만큼만 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 vs spring.net을 입력했을 때 Google이 가장 먼저 보여준 것입니다 ...
XML 설정이 마음에 들지 않으면 Spring은 이제 CodeConfig를 수행합니다.
http://www.springframework.net/codeconfig/doc-latest/reference/html/
또한 Spring은 단순한 DI 컨테이너 그 이상입니다. 문서에서 '모듈'섹션을 보면 DI 컨테이너가 수행하는 거대한 스택의 기초입니다.
내가 틀렸지 만 Autofac 자체가 다음 링크에 나열된 XML 구성을 지원한다고 생각합니다 : Autofac XML 구성
주목할 사항 : Ninject는 웹 사이트에 따라 상황에 따른 의존성 주입을 지원하는 유일한 IoC 컨테이너입니다. 그러나 다른 IoC 컨테이너에 대한 경험이 없으므로 보유 여부를 알 수 없습니다.
내 2 센트를 추가하기 위해 StructureMap과 Unity를 모두 시도했습니다. StructureMap이 잘못 / 잘못 문서화되어 있고, 구성하기가 쉽지 않고, 사용하기 불편한 것을 발견했습니다. 마찬가지로 해결 시간에 생성자 인수 재정의와 같은 시나리오를 지원하지 않는 것 같습니다. 이는 주요 사용 지점이었습니다. 그래서 나는 그것을 떨어 뜨리고 Unity와 함께 갔으며 약 20 분 안에 원하는 일을했습니다.
개인적으로 Unity를 사용하지만 Microsoft에서 온 것이기 때문입니다. 한 가지 이유 때문에 결정을 후회합니다. 그에 대한 가장 큰 문제는 하나의 큰 "버그"가있어 계속 예외를 발생시킵니다. 디버깅하는 동안 예외를 무시할 수 있습니다. 그러나 예외를 던지면 비용이 많이 들기 때문에 애플리케이션 을 실행하면 애플리케이션 속도가 엄청나게 느려집니다 . 예를 들어, 현재 Unity의 예외가 페이지의 렌더링 시간에 4 초 를 더 추가하는 코드의 한 지점에서이 예외를 "고정"하고 있습니다. 자세한 내용과 해결 방법은 다음을 참조하십시오.