Ninject:Hint命名对父类绑定的依赖

时间:2016-01-29 15:27:57

标签: c# dependency-injection ninject

我有一个类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>();

感谢您的帮助!

0 个答案:

没有答案
相关问题