Ввод нескольких параметров конструктора того же типа с помощью Ninject 2.0

Я использую 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)
{
}

Ответ 1

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

Если вы решили остаться с тем же интерфейсом, что и использовать условные привязки. См. Документацию о том, как это делается:

https://github.com/ninject/ninject/wiki/Contextual-Binding

https://github.com/ninject/ninject/wiki/Conventions-Based-Binding