Ninject - (usercontrol)不包含带0参数的构造函数

时间:2013-11-01 02:36:21

标签: c# asp.net

您好:我已经成功地将Ninject与MVC 3/4和WCF Extensions一起使用。我现在正在尝试使用WebForms进行简单的实现并遇到了挑战。步骤:

  1. 我从NuGet下载了Ninject.Web并安装到我的WebForms项目中
  2. 我编辑了NinjectWebCommon.cs - > CreateKernel方法:

            kernel.Bind<ICasePresenter>().To<Presenter.CasePresenter>();
    
  3. 我编辑了我的用户控件:

    [Inject]
    private ICasePresenter presenter;
    
    public CaseSummaryControl(ICasePresenter presenter)
    {
        this.presenter = presenter;
    }
    
  4. 我可以看到断点击中了我的绑定,但后来我得到的错误是用户控件不包含带0参数的构造函数。它不是注入我的实例(即使我添加了一个没有参数的构造函数,私有var也最终为null。

    提前致谢!

2 个答案:

答案 0 :(得分:1)

您正在使用字段注入而不是构造函数注入。只需将Inject属性移动到构造函数:

private ICasePresenter presenter;

[Inject]
public CaseSummaryControl(ICasePresenter presenter)
{
    this.presenter = presenter;
}

或添加不带参数的构造函数:

[Inject]
private ICasePresenter presenter;

public CaseSummaryControl(ICasePresenter presenter)
{
    this.presenter = presenter;
}

public CaseSummaryControl()
{

}

这样你可以使用参数保持构造函数以进行单元测试。

缺点是可能需要在使用this.presenter时添加空值检查,因为您现在有一条路径可以创建CaseSummaryControl 而不用指定ICasePresenter

阅读各种注射模式的Ninject documenation

答案 1 :(得分:0)

ASP.NET Webforms主要支持基于PROPERTY的注入。如果您使用构造函数来定义Injection,那么它只会抛出错误。

以下是您可以按照今天的文档

执行的步骤
  1. 使用 程序包管理器控制台 安装 Ninject ,方法是输入 Install-Package Ninject.Web
  2. 现在应该安装Ninject,你会在 App_Start 中看到一个名为 NinjectWebCommon.cs 的文件夹。只需将你的绑定放在那里,就像提问者已经写好的那样。
  3. 而不是创建构造函数在您的调用类/方法中创建公共属性,并在其上方使用 [Inject] 属性。
  4. 现在应该自动编译您的应用程序和依赖项。

    您可以在另一篇帖子Using Ninject v3 in ASP.NET Web Forms

    中看到这些步骤的快照演示