我正在使用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)
{
}