注入多个相同类型的构造函数的参数与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
感谢圣雷莫。它们实际上是抽象工厂的不同实现,它们在UI中创建Tabs,因此它们做同样的事情......仅仅是出于不同的原因。 – Stimul8d
我认为你没有正确理解。从消费者的角度来看,他们不是一回事。界面应该从消费者的角度来定义。例如。如果你有一个工厂接口'水果CreateFruit()'和消费者期待两种实现一个香蕉,一个橙子,那么你应该更好地定义接口'香蕉CreateBanana()'和'橙色CreateOrange()'即使你需要他们只是作为水果。 –
我明白了。你建议我使用工厂方法,而不是一个抽象工厂用混凝土工厂类。这是一个选项,但工厂类本身有依赖(在这种情况下,子屏幕),它需要注入。这些依赖更容易解决与具体工厂和构造函数注入,而不是工厂方法不是他们还是没有Ninject有一些其他的魔术我失踪? – Stimul8d