Ninject .ToFactory:异常:"异常抛出:' Ninject.ActivationException'在Ninject.dll"

时间:2017-02-06 10:20:42

标签: c# ninject factory-pattern

我指示Ninject在界面上创建工厂:

this.Bind<IModelFactory>().ToFactory().InSingletonScope();

在这个工厂界面中,我定义了工厂:

interface IModelFactory
{
    MyClass CreateMyClassFactory(string param1, DateTime param2);
}
然后我尝试使用工厂创建一个新类:

Class myClass = modelFactory.CreateMyClassFactory(param1, new DateTime(2017,01,01);

...但它会抛出此异常:

  

抛出异常:&#39; Ninject.ActivationException&#39;在Ninject.dll中

     

其他信息:激活字符串

时出错      

没有匹配的绑定可用,并且该类型不可自我绑定。

     

激活路径:

     

2)将依赖字符串注入MyClass类型的构造函数的参数标题

     

1)请求HedgeOrderMyClass

     

建议:

     

1)确保您已为字符串定义了绑定。

     

2)如果在模块中定义了绑定,请确保已将模块加载到内核中。

     

3)确保您没有意外创建多个内核。

     

4)如果使用构造函数参数,请确保参数名称与构造函数参数名称匹配。

     

5)如果使用自动模块加载,请确保搜索路径和过滤器正确无误。

2 个答案:

答案 0 :(得分:0)

当您指示Ninject在界面上创建工厂时,您要求它从容器中提取该类的新副本,并在运行时填写任何缺少的参数。

这是我们想要的课程:

public class MyClass
{

}

只要至少有一个构造函数接受stringDateTime类型的参数,它就会起作用:

public class MyClass
{
    // If this constructor is missing, then it throws an exception!
    MyClass(string param1, DateTime param2, ISomeOtherInterface someOtherInterface)
    {
    }
}

Ninject知道如何解决ISomeOtherInterface,因此没问题(假设我们在其他地方使用过Bind<>.To<>)。但是它如何解决string param1DateTime param2

工厂方法得到了拯救:它从参数到工厂调用中填充了这些参数,一切运行良好。

如果使用调试器运行,您将看到上面的构造函数被调用,其参数与工厂创建调用中指定的参数相同。

这是一个非常强大的想法,并且避免了必须手动编写所有粘合代码来创建自己的工厂。

答案 1 :(得分:0)

这就是我通常用Ninject.ActivationException解决问题的方法:

using Ninject.Extensions.Factory;

// ...

var kernel = new StandardKernel()
kernel.Bind<IMyClass>().ToFactory();