Lazy<> Ninject注入

8

我使用Ninject框架。在我的代码中,我有一个Lazy对象。我可以创建一个实例,但当我调用value属性时,会出现异常。

 private Lazy<IPsoriasisReportUserControl> psoriasisReportUserControl;

[Inject]
    public Lazy<IPsoriasisReportUserControl> PsoriasisReportUserControl
    {
        get { return psoriasisReportUserControl; }
        set { psoriasisReportUserControl = value; }
    }

我收到了以下异常:

懒惰初始化类型没有公共的无参构造函数

这是因为注入没有将方法注入到构造函数中。我认为我需要编写一个方法来绑定并创建一个新的实例。

3个回答

13

事实上,与源代码存储库相比,维基百科的链接可能是更有用的参考,因为它显示了应该如何注入Lazy<T>: https://github.com/ninject/Ninject.Extensions.Factory/wiki/Lazy - Philip Atz

9
Bind(typeof (Lazy<IPsoriasisReportUserControl>)).ToMethod(
            ctx => new Lazy<IPsoriasisReportUserControl>(() =>
                  Kernel.Get<IPsoriasisReportUserControl>()));

这个答案是可行的。但你也可以通过使用NInject扩展工厂来实现另一个答案。它会自动工作。 - jsgoupil

1
Lazy类需要一个默认的公共构造函数:
public Lazy() {}

有一个无参构造函数。我认为注入没有使用它。不知道该如何配置。 - Lajos
1
“Lazy” 可能是 BCL 中的一种类型。你很难改变它。 - ta.speot.is
[测试方法] public void UC_DiagnosticReport_How_Lazy_Works() { Lazy<IPsoriasisReportUserControl> a = new Lazy<IPsoriasisReportUserControl>(NinjectService.Get<IPsoriasisReportUserControl>); var b = a.Value; Assert.IsNotNull(b); }这段代码可以运行。我需要它。 - Lajos
你必须这样绑定 IPsoriasisReportUserControl:kernel.Bind(typeof(IPsoriasisReportUserControl)).To(typeof(PsoriasisReportUserControl); 在 Lazy<> 的绑定之前。 - Joffrey Kern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接