注入多个相同类型的构造函数的参数与Ninject 2.0

问题描述:

我使用Ninject 2.0处理DI在我的应用程序之一,我已经遇到东西是困惑我。没有文档也没有太大的帮助,说实话。注入多个相同类型的构造函数的参数与Ninject 2.0

说我有一个签名构造 -

ctor(IServiceFactory factory1, IServiceFactory factory2) 
{ 
    this.factory1 = factory1; 
    this.factory2 = factory2; 
} 

虽然这两个服务实现相同的接口,它们是完全不同的实现,并在不同的时间使用,所以我不希望注入的IEnumerable<IServiceFactory>

我的问题是,当我绑定实例时,我该如何告诉Ninject要为每个实例注入什么?

在此先感谢。

更新

对于任何人希望看到代码的缘故阅读雷莫的链接后,将结束,...这是短暂的。 (我从来不知道C#有参数属性!)你要问自己,如果使用相同的接口是否正确,如果实现需要做完全不同的事情

//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) 
{ 
} 

第一。通常,接口是消费者与实现之间的契约。所以如果消费者期望不同的东西,那么你可能会考虑定义不同的接口。

如果您决定使用相同的界面,则必须使用条件绑定。请参阅有关如何做到这一点的文档:

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

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

+0

感谢圣雷莫。它们实际上是抽象工厂的不同实现,它们在UI中创建Tabs,因此它们做同样的事情......仅仅是出于不同的原因。 – Stimul8d

+1

我认为你没有正确理解。从消费者的角度来看,他们不是一回事。界面应该从消费者的角度来定义。例如。如果你有一个工厂接口'水果CreateFruit()'和消费者期待两种实现一个香蕉,一个橙子,那么你应该更好地定义接口'香蕉CreateBanana()'和'橙色CreateOrange()'即使你需要他们只是作为水果。 –

+0

我明白了。你建议我使用工厂方法,而不是一个抽象工厂用混凝土工厂类。这是一个选项,但工厂类本身有依赖(在这种情况下,子屏幕),它需要注入。这些依赖更容易解决与具体工厂和构造函数注入,而不是工厂方法不是他们还是没有Ninject有一些其他的魔术我失踪? – Stimul8d