Я использую Ninject 2.0 для обработки DI в одном из моих приложений, и я сталкивался с чем-то, что меня сбивало с толку. Нулевая документация не слишком помогает, чтобы быть честным.
Скажем, у меня есть конструктор с сигнатурой -
ctor(IServiceFactory factory1, IServiceFactory factory2)
{
this.factory1 = factory1;
this.factory2 = factory2;
}
Хотя эти две службы реализуют один и тот же интерфейс, они совершенно разные реализации и используются в разное время, поэтому я не хочу вводить IEnumerable<IServiceFactory>
.
Мой вопрос в том, когда я связываю экземпляры, как я могу указать Ninject, что нужно вводить для каждого?
Спасибо заранее.
Update
Ради кого-либо, желающего увидеть, что код закончится после прочтения ссылок Remo,... Вот он кратко. (Я никогда не думал, что С# имеет атрибуты параметров!)
//abstract factory
public interface IServiceFactory
{
Service Create();
}
//concrete factories
public class Service1Factory : IServiceFactory
{
public IService Create()
{
return new Service1();
}
}
public class Service2Factory : IServiceFactory
{
public IService Create()
{
return new Service2();
}
}
//Binding Module (in composition root)
public class ServiceFactoryModule : NinjectModule
{
public override void Load()
{
Bind<IServiceFactory>()
.To<Service1Factory>()
.Named("Service1");
Bind<IServiceFactory>()
.To<Service2Factory>()
.Named("Service2");
}
}
//consumer of bindings
public class Consumer(
[Named("Service1")] service1Factory,
[Named("Service2")] service2Factory)
{
}