如果我有使用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();
}
最佳答案
典型的方法是使用命名绑定:
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/