Я готовлю презентацию к группе пользователей. Как таковой я просто прошел набор их. А именно: AutoFac, MEF, Ninject, Spring. Сеть, StructureMap, Единица и Виндзор.
я хотел представить 90%-й случай (инжекция конструктора, которая является главным образом, для чего люди используют МОК так или иначе). можно проверить решение здесь (VS2008)
По сути, существует несколько основных отличий:
у Каждого из них есть другие функции также (у некоторых есть AOP, и лучшие штуковины, но обычно все я хочу, чтобы МОК сделал, создают и получают объекты для меня)
Примечание: различия между различными библиотеками возражают, что извлечение может отрицаться при помощи 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 также очень lambda'y. В целом, это - одно из моего избранного. Некоторые очень интересные идеи вокруг, как 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 функциональности. Сеть делает все под солнцем, которое может сделать МОК. Но потому что единственный способ унифицировать через XML, его обычно избегают магазины .NET. Хотя, много Spring использования магазина .net/Java. Сеть из-за подобия между версией .NET Spring. Сеть и проект Spring Java.
Примечание : Конфигурация в коде теперь возможна с введением [1 111] Spring.NET CodeConfig.
XML и код. Как Spring. Сеть, Виндзор сделает что угодно, что Вы могли хотеть, чтобы это сделало. Виндзор является, вероятно, одним из самых популярных контейнеров МОК вокруг.
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 языка и наибольшую гибкость в инициализации.
Примечание : Chris Brandsma превратил свой исходный ответ в сообщение в блоге .
Насколько я видел, что они - в значительной степени то же, за исключением нескольких деталей реализации тут и там. Самое большое преимущество, которое Единица имеет по конкуренции, состоит в том, что она обеспечивается Microsoft, существует много компаний там, которые боятся OSS
, Один недостаток - то, что это является довольно новым, таким образом, она могла бы иметь ошибки, в которых уже разобрались плееры старшего возраста.
Однако Вы могли бы хотеть к проверка это .
Исправьте меня, если я ошибаюсь, но я думаю, что сам Autofac поддерживает конфигурацию XML, как перечислено в этой ссылке: конфигурация XML Autofac
Spring имеет одну функцию, которая может вводить параметры в конструктор или свойство на основе имени параметра или позиции. Это очень полезно, если параметр или свойство имеет простой тип (например, целое число, логическое значение). См. пример здесь . Я не думаю, что это действительно компенсирует неспособность Spring выполнить конфигурацию в коде.
Виндзор тоже может это сделать, и может сделать это в коде, а не в конфигурации. (поправьте меня, если я ошибаюсь, я просто использую то, что слышал здесь.)
Я хотел бы знать, может ли Unity это сделать.