我指示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)如果使用自动模块加载,请确保搜索路径和过滤器正确无误。
答案 0 :(得分:0)
当您指示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
?
工厂方法得到了拯救:它从参数到工厂调用中填充了这些参数,一切运行良好。
如果使用调试器运行,您将看到上面的构造函数被调用,其参数与工厂创建调用中指定的参数相同。
这是一个非常强大的想法,并且避免了必须手动编写所有粘合代码来创建自己的工厂。
答案 1 :(得分:0)
这就是我通常用Ninject.ActivationException解决问题的方法:
using Ninject.Extensions.Factory;
// ...
var kernel = new StandardKernel()
kernel.Bind<IMyClass>().ToFactory();