我有一个类Consumer,它本身需要一定的服务IService。
interface IService{...}
class ConcreteService : IService{...}
class Consumer
{
public Consumer(string someString, IService service)
{
//Use service
}
}
但是,在我的系统中,我需要相同IService实现的不同实例。还有不同的消费者实例需要某个服务实例。一些消费者要求MyService1其他人需要MyService2。为了解决这个问题,我创建了从IService到ConcreteService的命名绑定。我把它连接起来了。
Bind<IService>().To<ConcreteService>().Named("MyService1");
Bind<IService>().To<ConcreteService>().Named("MyService2");
Bind<Consumer>().ToConstructor<Consumer>(c => new Consumer("Consumer1", c.Context.Kernel.Get<IService>("MyService1")));
Bind<Consumer>().ToConstructor<Consumer>(c => new Consumer("Consumer2", c.Context.Kernel.Get<IService>("MyService2")));
这是解决此类问题的首选解决方案吗?我认为有一些选择。
首先,我可以创建两个不同的子类Consumer1和Consumer2,并在依赖项上使用[Named(..)]属性。但我真的不喜欢DI框架泄漏到我的模型中。除此之外,它可能会产生大量的子类。
我的另一个选项是创建一个额外的类ServiceAggregator,它获取所有注入的IService绑定。然后,Consumer类可以使用ServiceAggregator来查找适当的服务。如果Consumer类在运行时需要另一个Service,我会使用这样的方法,但我认为如果在对象实例化期间可以解析依赖关系,那就没有多大意义了。
class ServiceAggregator
{
public ServiceAggregator(IService[] services)
{...}
public IService GetService(string serviceIdentifier)
{...}
}
class Consumer
{
IService myService;
public Consumer(string someString, string serviceName, ServiceAggregator aggregator)
{
myService = aggregator.GetService(serviceName);
}
}
当为同一个接口定义了多个绑定时,有没有办法告诉Ninject使用哪个依赖项?
Bind<Consumer>().To<Consumer().HeyNinjectUse(“MyService1”).IfThereAreMultipleBindingsOf<IService>();
感谢您的帮助!