Корпоративная библиотека Unity против других контейнеров IoC [закрыто]
-
03-07-2019 - |
Вопрос
Каковы плюсы и минусы использования корпоративной библиотеки 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 все время?