Ответ 1
Я готовлю презентацию для группы. Таким образом, я просто прошел через их группу. А именно: AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity и Windsor.
Я хотел показать 90% -ный случай (инъекция конструктора, в основном это то, что люди используют IOC в любом случае). Вы можете проверить решение здесь (VS2008)
Таким образом, существует несколько ключевых отличий:
- Инициализация
- Поиск объектов
У каждого из них есть и другие функции (у некоторых есть AOP и лучшие вещицы, но, как правило, все, что я хочу сделать, это создавать и извлекать объекты для меня)
Примечание: различия между поиском объектов разных библиотек можно скрыть с помощью CommonServiceLocator: http://www.codeplex.com/CommonServiceLocator
Это оставляет нам инициализацию, которая выполняется двумя способами: через код или через конфигурацию XML (app.config/web.config/custom.config). Некоторые поддерживают оба, некоторые поддерживают только один. Я должен отметить: некоторые используют атрибуты, чтобы помочь IoC.
Итак, вот моя оценка различий:
Ninject
Только инициализация кода (с атрибутами). Надеюсь, тебе нравятся лямбды. Код инициализации выглядит следующим образом:
IKernel kernel = new StandardKernel(
new InlineModule(
x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
StructureMap
Код инициализации или 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>();
});
Unity
Инициализационный код и XML. Хорошая библиотека, но конфигурация XML - это боль в прикладе. Отличная библиотека для Microsoft или шоссейных магазинов. Инициализация кода проста:
container.RegisterType<ICustomerRepository, CustomerRepository>()
.RegisterType<ICustomerService, CustomerService>();
Spring.NET
XML только как можно ближе. Но для функциональности Spring.Net делает все под солнцем, которое может сделать IoC. Но поскольку единственный способ унифицировать это через XML, его обычно избегают магазины .net. Хотя, многие .net/Java-магазин используют Spring.Net из-за сходства между .net-версией проекта Spring.Net и Java Spring.
Примечание. Конфигурация в коде теперь возможна с введением Spring.NET CodeConfig.
Windsor
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");
Autofac
Может смешивать как XML, так и код (с v1.2). Хорошая простая библиотека IoC. Кажется, делать основы с не очень суетным. Поддерживает вложенные контейнеры с локальным определением компонентов и четко определенным временем жизни.
Вот как вы его инициализировали:
var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
.As<ICustomerRepository>()
.ContainerScoped();
builder.Register<CustomerService>()
.As<ICustomerService>()
.ContainerScoped();
builder.Register<Form1>();
Если бы мне пришлось выбирать сегодня: я бы, вероятно, пошел с StructureMap. Он имеет лучшую поддержку языковых функций С# 3.0 и большую гибкость при инициализации.
Примечание. Крис Брандсма включил свой оригинальный ответ в сообщение .