我有一个延迟加载的对象,我想创建一个通过Ninject的实例,但它不起作用。
interface IFoo {
string GetData();
}
class Foo : IFoo {
private string _data;
public Foo(string data) {
_data = data;
}
public string GetData() {
return _data;
}
}
class MyModule : NinjectModule {
public override void Load() {
Bind<IFoo>.To<Foo>().InTransientScope().WithConstructorArgument("data", "blah");
}
}
// ...
var kernel = new StandardKernel(new MyModule());
Lazy<Foo> myFoo = kernel.Get<IFoo>();
Console.WriteLine(myFoo.GetData());
// Result:
// MissingMemberException: The lazily-initialized type does not have a public, parameterless constructor.
它抱怨Foo没有无参数构造函数,这是正确的,但为什么它需要一个,因为我已经为NInject提供了构造函数参数及其值。
当我使用IFoo
而不是Lazy<IFoo>
时,这是有效的...所以如何指定我希望延迟加载的对象也使用参数化构造函数?
答案 0 :(得分:0)
您无法获得IFoo
并将其分配给Lazy<IFoo>
,就像您在
Lazy<Foo> myFoo = kernel.Get<IFoo>();
取而代之的是Lazy<IFoo>
Lazy<Foo> myFoo = kernel.Get<Lazy<IFoo>>();
这需要Ninject.Extensions.Factory