Enterprise Library Unity 및 기타 IoC 컨테이너
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");
오토 팩
Can mix both XML and code (with v1.2). Nice simple IoC library. Seems to do the basics with not much fuss. Supports nested containers with local scoping of components and a well-defined life-time management.
Here is how you initialize it:
var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
.As<ICustomerRepository>()
.ContainerScoped();
builder.Register<CustomerService>()
.As<ICustomerService>()
.ContainerScoped();
builder.Register<Form1>();
If I had to choose today: I would probably go with StructureMap. It has the best support for C# 3.0 language features, and the most flexibility in initialization.
Note: Chris Brandsma turned his original answer into a blog post.
As far as I've seen they are pretty much the same, except for a few implementation details here and there. The biggest advantage that Unity has over the competition is that it is provided by Microsoft, there are lots of companies out there that are afraid of OSS.
One disadvantage is that it's rather new so it might have bugs that the older players have already sorted out.
Having said that, you might want to check this out.
Old thread but since this is the first thing that Google showed me when I typed in unity vs spring.net...
Spring does do CodeConfig now if you don't like XML config
http://www.springframework.net/codeconfig/doc-latest/reference/html/
Also, Spring is much more than just an DI container, if you look at the 'Modules' section in the docs, the DI container is the foundation of the huge stack of things it does.
Correct me if I'm mistaken but I think Autofac itself supports XML Configuration as listed in this link: Autofac XML Configuration
Spring has one feature that it can inject parameters to constructor or property based on the parameter name or position. This is very useful if the parameter or property is a simple type (e.g. an integer, a boolean). See the example here. I don't think that this really makes up for Spring's inability to do config in code.
Windsor can also do this, and can do it in code not config. (correct me if I'm wrong, I'm just going via what I've heard here).
I would like to know if Unity can do this.
One thing to note: Ninject is the only IoC container that supports contextual dependency injections (as per their Web site). However, because I don't have experience with other IoC containers, I can't tell if that holds.
Just to add my 2 cents, I've tried both StructureMap and Unity. I found StructureMap to be poorly/misguidingly documented, a pain in the butt to configure, and clunky to use. Likewise, it doesn't seem to support scenarios like constructor argument overrides at resolution time, which was a key usage point for me. So I dropped it and went with Unity, and had it doing what I wanted in about 20 minutes.
I personally use Unity, but only because it is from Microsoft. I regret the decision for one reason: the biggest thing it has against it has one big "bug" that causes it to constantly throws exceptions. You can ignore the exceptions while debugging. However it slows down your application tremendously if you run across it, since throwing an exception is an expensive operation. For example, I'm currently "fixing" this exception in one spot in my code where Unity's exceptions adds an extra 4 seconds to a page's render time. For more details and a workaround, see:
Can Unity be made to not throw SynchronizationLockException all the time?
참고URL : https://stackoverflow.com/questions/411660/enterprise-library-unity-vs-other-ioc-containers
'development' 카테고리의 다른 글
Windows 서비스로서의 .NET 콘솔 어플리케이션 (0) | 2020.06.28 |
---|---|
jQuery“속성이없는”선택기? (0) | 2020.06.28 |
PDO 데이터베이스 쿼리를 디버깅하는 방법? (0) | 2020.06.28 |
C #의 GetHashCode 지침 (0) | 2020.06.28 |
Visual Studio 2012-Intellisense가 때때로 사라지거나 손상됨 (0) | 2020.06.28 |