Ninject - 使用单个接口的多个类(可以使用多个匹配的绑定)

时间:2014-11-10 22:22:32

标签: c# inversion-of-control ninject-2

如果我有使用IPerson接口的Human和Dog类的实现,使用IFood接口使用HumanFood和DogFood类。如何在我的主要功能中从使用HumanFood切换到DogFood和Human到Dog?

目前编写本文的方式是给我一个"可以使用多个匹配的绑定"错误。

谢谢!

public class Bindings : NinjectModule
{
    public override void Load()
    {
        this.Bind<IFood>().To<HumanFood>();
        this.Bind<IFood>().To<DogFood>(); 
        this.Bind<IPerson>().To<Human>();
        this.Bind<IPerson>().To<Dog>(); 
    }
}

static void Main(string[] args)
{
    IKernel kernel = new StandardKernel();
    kernel.Load(Assembly.GetExecutingAssembly());

    IFood food = kernel.Get<IFood>();
    IPerson person = kernel.Get<IPerson>();
    person.BuyFood();

    Console.ReadLine();
}

1 个答案:

答案 0 :(得分:3)

执行此操作的典型方法是使用命名绑定:

this.Bind<IFood>().To<HumanFood>().Named("HumanFood");

或者根据WhenInjectedInto确定要使用的绑定:

this.Bind<IFood>().To<HumanFood>().WhenInjectedInto<Human>();
this.Bind<IFood>().To<DogFood>().WhenInjectedInto<Dog>();

但是,这两个代表代码气味。您可能想重新考虑为什么要根据目标注入不同的实现,并且可能会注入工厂模式的实现。

可以在此处找到您可以做的一些方便的概述:

http://lukewickstead.wordpress.com/2013/02/09/howto-ninject-part-2-advanced-features/