我正在使用Ninject 2.0在我的某个应用程序中处理DI,而且我遇到了令我困惑的事情。说实话,没有文件也没有太多帮助。
假设我有一个带签名的构造函数 -
ctor(IServiceFactory factory1, IServiceFactory factory2)
{
this.factory1 = factory1;
this.factory2 = factory2;
}
虽然这两个服务实现了相同的接口,但它们是完全不同的实现,并且在不同的时间使用,因此我不想注入IEnumerable<IServiceFactory>
。
我的问题是,当我绑定实例时,如何告诉Ninject为每个实例注入什么?
提前致谢。
为了想要看到代码在读完Remo的链接后结束的人,...这里简单介绍一下。 (我从未意识到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)
{
}
答案 0 :(得分:10)
首先,如果实现需要做一个完全不同的事情,你必须问自己,使用相同的接口是否正确。通常,接口是消费者和实现之间的契约。因此,如果消费者期望不同的东西,那么您可以考虑定义不同的接口。
如果您决定使用相同的界面,则必须使用条件绑定。请参阅有关如何完成此操作的文档:
https://github.com/ninject/ninject/wiki/Contextual-Binding
https://github.com/ninject/ninject/wiki/Conventions-Based-Binding