[英]Ninject .ToFactory: Exception: "Exception thrown: 'Ninject.ActivationException' in Ninject.dll"
我指示 Ninject 在一个接口上创建一个工厂:
this.Bind<IModelFactory>().ToFactory().InSingletonScope();
在这个工厂接口中,我定义了工厂:
interface IModelFactory
{
MyClass CreateMyClassFactory(string param1, DateTime param2);
}
然后我尝试使用工厂来创建一个新类:
Class myClass = modelFactory.CreateMyClassFactory(param1, new DateTime(2017,01,01);
...但它抛出这个异常:
抛出异常:Ninject.dll 中的“Ninject.ActivationException”
附加信息:激活字符串时出错
没有匹配的绑定可用,并且类型不可自绑定。
激活路径:
2) 将依赖字符串注入 MyClass 类型的构造函数的参数标题中
1) 请求 HedgeOrderMyClass
建议:
1) 确保您已为字符串定义了绑定。
2) 如果绑定是在模块中定义的,请确保该模块已加载到内核中。
3) 确保您没有意外创建多个内核。
4) 如果您使用构造函数参数,请确保参数名称与构造函数参数名称匹配。
5) 如果您使用自动模块加载,请确保搜索路径和过滤器正确。
当您指示 Ninject 在接口上创建工厂时,您是在要求它从容器中拉出该类的新副本,并在运行时填充任何缺失的参数。
这是我们想要的类:
public class MyClass
{
}
只要至少有一个构造函数接受string
和DateTime
类型的参数,它就会起作用:
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 param1
和DateTime param2
呢?
工厂方法来拯救:它填充从参数到工厂调用的那些参数,并且一切正常。
如果您使用调试器运行,您将看到上面的构造函数被调用,其参数与工厂创建调用中指定的参数相同。
这是一个非常强大的想法,并且避免了必须手动编写所有粘合代码来创建自己的工厂。
这就是我通常用 Ninject.ActivationException 解决问题的方法:
using Ninject.Extensions.Factory;
// ...
var kernel = new StandardKernel()
kernel.Bind<IMyClass>().ToFactory();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.