Корпоративная библиотека Unity против других контейнеров IoC [закрыто]

StackOverflow https://stackoverflow.com/questions/411660

Вопрос

Каковы плюсы и минусы использования корпоративной библиотеки 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).Некоторые поддерживают и то, и другое, некоторые поддерживают только одно.Я должен отметить:некоторые используют атрибуты, чтобы помочь МоК продвигаться вперед.

Итак, вот моя оценка различий:

Девятый объект

Только инициализация кода (с атрибутами).Надеюсь, вам нравятся лямбды.Код инициализации выглядит следующим образом:

 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 или highway shops.Инициализация кода проста:

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

Spring.NET

XML только настолько близко, насколько я могу судить.Но для функциональности Spring.Net делает все под солнцем, что может сделать МоК.Но поскольку единственный способ унификации - это использование XML, магазины .net обычно избегают этого.Хотя многие магазины .net / Java используют Spring.Net из-за сходства между .net-версией Spring.Net и Java Spring project.

Примечание:Настройка в коде теперь возможна с введением Spring.Настройка СЕТЕВОГО кода.

Виндзор

XML и код.Как весна.Net, Windsor сделает все, что вы могли бы пожелать.Windsor, вероятно, является одним из самых популярных контейнеров МоК в округе.

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.

Один недостаток в том, что он довольно новый, поэтому в нем могут быть ошибки, которые старые игроки уже разобрали.

Сказав это, вы можете захотеть проверить это .

Старый поток, но так как это первое, что Google показал мне, когда я набрал текст в единстве против spring.net ...

Spring делает CodeConfig сейчас, если вам не нравится XML config

http://www.springframework.net/codeconfig/doc-latest / ссылка / HTML /

Кроме того, Spring - это нечто большее, чем просто контейнер DI. Если вы посмотрите на раздел «Модули» в документации, контейнер DI является основой огромного стека вещей, которые он делает.

Поправьте меня, если я ошибаюсь, но я думаю, что сам Autofac поддерживает конфигурацию XML, как указано в этой ссылке: Конфигурация Autofac XML

Spring имеет одну особенность, которая может вводить параметры в конструктор или свойство на основе имени или позиции параметра. Это очень полезно, если параметр или свойство является простым типом (например, целое число, логическое значение). См. пример здесь . Я не думаю, что это действительно компенсирует неспособность Spring конфигурировать код.

Виндзор также может сделать это, и может сделать это в коде, а не в конфигурации. (поправьте меня, если я ошибаюсь, я просто просматриваю то, что слышал здесь).

Я хотел бы знать, может ли Unity сделать это.

Стоит отметить: Ninject - единственный контейнер IoC, который поддерживает контекстные инъекции зависимостей (согласно их веб-сайту). Тем не менее, поскольку у меня нет опыта работы с другими контейнерами IoC, я не могу сказать, так ли это.

Просто чтобы добавить свои 2 цента, я попробовал и StructureMap, и Unity. Я обнаружил, что StructureMap плохо / ошибочно задокументирован, это проблема в настройке и неудобная работа. Кроме того, похоже, что он не поддерживает сценарии, такие как переопределение аргументов конструктора во время разрешения, что было для меня ключевым моментом использования. Поэтому я бросил его и пошел с Unity, и он делал то, что хотел, примерно через 20 минут.

Я лично использую Unity, но только потому, что он от Microsoft. Я сожалею о решении по одной причине: самая большая вещь, которую он имеет против, имеет одну большую "ошибку" это заставляет это постоянно бросать исключения. Вы можете игнорировать исключения во время отладки. Однако если вы столкнетесь с ним, оно значительно замедлит работу вашего приложения, поскольку создание исключения является дорогостоящей операцией. Например, я сейчас "исправляю" это исключение в одном месте моего кода, где исключения Unity добавляют дополнительные 4 секунды ко времени рендеринга страницы. Для получения дополнительной информации и обходного пути см .:

Можно ли заставить Unity не выбрасывать SynchronizationLockException все время?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top