对于Lazy <t>的Ninject绑定,其中T&#39的构造函数具有参数</t>

时间:2014-04-14 19:08:04

标签: c# constructor ninject lazy-loading

我有一个延迟加载的对象,我想创建一个通过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>时,这是有效的...所以如何指定我希望延迟加载的对象也使用参数化构造函数?

1 个答案:

答案 0 :(得分:0)

您无法获得IFoo并将其分配给Lazy<IFoo>,就像您在

中一样
Lazy<Foo> myFoo = kernel.Get<IFoo>();

取而代之的是Lazy<IFoo>

Lazy<Foo> myFoo = kernel.Get<Lazy<IFoo>>();

这需要Ninject.Extensions.Factory