Enterprise Library Unity vs Other IOC Containers [closed]

Jakie są plusy i minusy korzystania z Enterprise Library Unity vs inne kontenery IoC (Windsor, Spring.Net, Autofac ..)?

Author: Grigori Melnik, 2009-01-05

8 answers

Przygotowuję prezentację dla grupy użytkowników. W związku z tym właśnie przejrzałem kilka z nich. Mianowicie: AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity, and Windsor.

Chciałem pokazać przypadek 90% (constructor injection, do którego i tak głównie ludzie używają IOC). możesz sprawdzić rozwiązanie tutaj (VS2008)

Jako takie istnieje kilka kluczowych różnic:

  • Inicjalizacja
  • Odzyskiwanie obiektów

Każdy z mają również inne funkcje (niektóre mają AOP i lepsze gadżety, ale ogólnie wszystko, co chcę zrobić IOC, to tworzyć i pobierać obiekty dla mnie) {]}

Uwaga: różnice między różnymi obiektami bibliotek można zanegować za pomocą CommonServiceLocator: http://www.codeplex.com/CommonServiceLocator

To pozostawia nam inicjalizację, która odbywa się na dwa sposoby: poprzez kod lub poprzez konfigurację XML (app.config / web.config / custom.config). Niektóre wsparcie oba, niektóre wspierają tylko jeden. Powinienem zauważyć: niektóre używają atrybutów, aby pomóc IoC wzdłuż.

Oto moja ocena różnic:

Ninject

Tylko inicjalizacja kodu (z atrybutami). Mam nadzieję, że lubisz lambdy. Kod inicjalizacji wygląda tak:

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

StructureMap

Kod inicjujący lub XML lub atrybuty. v2. 5 jest również bardzo lambda ' y. Podsumowując, jest to jeden z moich ulubionych. Kilka bardzo ciekawych pomysłów wokół jak StructureMap używa atrybutów.

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

Unity

Kod inicjujący i XML. Ładna biblioteka, ale konfiguracja XML to wrzód na tyłku. Świetna biblioteka dla Microsoft lub sklepów highway. Inicjalizacja kodu jest łatwa:

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

Spring.NET

XML tylko tak blisko, jak mogę powiedzieć. Ale dla funkcjonalności Spring.Net robi wszystko pod słońcem, co może zrobić MKOl. Ale ponieważ jedynym sposobem na unifikację jest XML, zwykle unika się go przez Sklepy. NET. Chociaż wiele sklepów. NET/Java używa Spring.Net ze względu na podobieństwo wersji. NET Spring.Net oraz projekt Java Spring.

Uwaga : Konfiguracja w kodzie jest teraz możliwa dzięki wprowadzeniu Spring.NET CodeConfig .

Windsor

XML i Kod. Jak Spring.Net Windsor zrobi wszystko, co zechcesz. Windsor jest prawdopodobnie jednym z najpopularniejszych kontenerów IoC w pobliżu.

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

Autofac

Może mieszać zarówno XML jak i kod (z v1.2). Fajna prosta biblioteka. Wydaje się robić podstawy bez większego zamieszania. Obsługuje zagnieżdżone kontenery z lokalnym zakresem komponentów i dobrze zdefiniowanym zarządzaniem czasem życia.

Oto jak go zainicjować:

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

Gdybym miał wybrać dzisiaj: prawdopodobnie wybrałbym StructureMap. Posiada najlepsze wsparcie dla funkcji języka C # 3.0 i największą elastyczność w inicjalizacja.

Uwaga : Chris Brandsma zamienił swoją oryginalną odpowiedź na post na blogu .

 229
Author: Chris Brandsma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-20 08:44:51

Z tego co widziałem są prawie takie same, z wyjątkiem kilku szczegółów implementacji tu i ówdzie. Największą zaletą Unity nad konkurencją jest to, że jest dostarczany przez Microsoft, istnieje wiele firm, które boją się OSS.

Jedną z wad jest to, że jest raczej nowy, więc może mieć błędy, które starsi gracze już rozwiązali.

Powiedziawszy to, możesz chcieć sprawdzić to .

 7
Author: rodbv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-04 21:52:46

Stary wątek, ale ponieważ to pierwsza rzecz, którą pokazał mi Google, gdy wpisywałem w unity vs spring.net...

Spring robi teraz CodeConfig jeśli nie lubisz XML config

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

Ponadto, Spring jest czymś więcej niż tylko kontenerem DI, jeśli spojrzysz na sekcję "Moduły" w dokumentach, kontener DI jest podstawą ogromnego stosu rzeczy, które robi.

 4
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-28 09:36:03

Popraw mnie jeśli się mylę, ale myślę, że sam Autofac obsługuje konfigurację XML, jak podano w tym linku: Autofac XML Configuration

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-16 04:08:03

Spring ma jedną cechę, że może wprowadzić parametry do konstruktora lub właściwości na podstawie nazwy parametru lub pozycji. Jest to bardzo przydatne, jeśli parametr lub właściwość jest typem prostym(np. liczba całkowita, logiczna). Zobacz przykład tutaj . Nie sądzę, że to naprawdę rekompensuje niemożność Spring zrobić config w kodzie.

Windsor może to również zrobić, i może to zrobić w kodzie nie config. (popraw mnie, jeśli się mylę, po prostu przechodzę przez to, co tu słyszałem).

I chciałbym wiedzieć, czy jedność może to zrobić.

 2
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-27 11:50:42

Jedna uwaga: Ninject jest jedynym kontenerem IoC, który obsługuje kontekstowe zastrzyki zależności (jak na ich stronie internetowej). Jednak, ponieważ nie mam doświadczenia z innymi kontenerami IoC, nie mogę powiedzieć, czy to trzyma.

 2
Author: ehsanullahjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 00:37:00

Aby dodać moje 2 centy, próbowałem zarówno StructureMap jak i Unity. Okazało się, że StructureMap jest słabo / błędnie udokumentowany, ból w tyłku do skonfigurowania i niezgrabny w użyciu. Podobnie, wydaje się, że nie obsługuje scenariuszy takich jak przesłonięcia argumentów konstruktora w czasie rozdzielczości, co było dla mnie kluczowym punktem użycia. Więc upuściłem go i poszedłem z Unity, i kazałem mu robić to, co chciałem w jakieś 20 minut.

 1
Author: Repo Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-24 19:37:49

Osobiście używam Unity, ale tylko dlatego, że jest od Microsoftu. Żałuję tej decyzji z jednego powodu: największa rzecz, jaką ma przeciwko niej, ma jeden wielki "bug", który powoduje, że ciągle rzuca wyjątki. Wyjątki można ignorować podczas debugowania. Jednak spowalnia Twoją aplikację ogromnie , jeśli ją napotkasz, ponieważ rzucanie wyjątków jest kosztowną operacją. Na przykład, obecnie "naprawiam" ten wyjątek w jednym miejscu w moim kodzie, gdzie wyjątki Unity dodaje dodatkowe 4 sekundy do czasu renderowania strony. Aby uzyskać więcej informacji i obejście, zobacz:

Czy Unity można zrobić, aby nie rzucać SynchronizationLockException cały czas?

 1
Author: Josh Mouch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:13