我可以使用Ninject按类型或类名动态获取实例吗

时间:2018-07-20 06:41:14

标签: c# dependency-injection inversion-of-control ninject bind

void Start () {
    IKernel nKernel = new StandardKernel();
    nKernel.Bind<IAnimal>().To(typeof(Dog)).Named("Dog");
    nKernel.Bind<IAnimal>().To(typeof(Cat)).Named("Cat");

    IAnimal animalInst = nKernel.Get<IAnimal>("Dog");
    Debug.LogError($"{animalInst.Name}");
    IAnimal  animalInst2 = nKernel.Get<IAnimal>("Cat");
    Debug.LogError($"{animalInst.Name}");
}

我想在运行时动态实例化IAnimal的子类,我尝试运行此代码,但发生错误 “ IAnimal animalInst2 = nKernel.Get(” Cat“);” => ActivationException:激活浮动时出错 没有匹配的绑定可用,并且类型不是自绑定的。 如何在一个接口上绑定子类?我可以按班级类型或班级名称获取它吗?

1 个答案:

答案 0 :(得分:0)

您的Cat类似乎具有一个带有float参数的构造函数。 Ninject无法解决此依赖性,因为值类型不可自绑定。

您可以将.WithConstructorArgument添加到绑定中:

nKernel.Bind<IAnimal>().To(typeof(Cat))
    .WithConstructorArgument("myFloatArgName", 0)
    .Named("Cat");

或者看看使用provider