【问题标题】:Ninject - (usercontrol) does not contain a constructor that takes 0 argumentsNinject - (usercontrol) 不包含带 0 个参数的构造函数
【发布时间】:2013-11-01 02:36:21
【问题描述】:

您好:我已经成功地将 Ninject 与 MVC 3/4 和 WCF 扩展一起使用。我现在正在尝试用 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;
    }
    

我可以看到断点命中我的绑定,但随后我收到错误消息,即用户控件不包含采用 0 个参数的构造函数。它没有注入我的实例(即使我添加了一个不带参数的构造函数,私有 var 最终也会为 null。

提前致谢!

【问题讨论】:

  • 请出示无参构造函数的代码。

标签: c# asp.net


【解决方案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 的路径没有指定 @ 987654328@。

阅读Ninject documenation 了解各种注入模式。

【讨论】:

  • 正如文档所述,我根本不必使用 [Inject] 属性(这是我以前的经验)。但是,如果我排除它,则在 CreateKernel() 中不会遇到断点。我尝试按照您在示例中提供的方式将其移至构造函数,并且断点被命中,但仍然出现 no constructor 错误。
  • 根据stackoverflow.com/questions/14323489/…,Web Forms 不支持构造函数注入,只支持字段注入。对此有任何确认吗?现场注入似乎工作......
  • @MQuickel 添加了替代解决方案。
【解决方案2】:

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

根据今天的文档,您可以按照以下步骤操作

  1. 通过输入 Install-Package Ninject.Web 使用 Package Manager Console 安装 Ninject强>。
  2. 现在应该安装 Ninject,您会在 App_Start 中看到一个名为 NinjectWebCommon.cs 的文件文件夹。只需将您的绑定放在那里,就像提问者已经写的那样。
  3. 与其创建构造函数,不如在调用类/方法中创建公共属性并在其上方使用 [Inject] 属性。

编译您的应用程序,现在应该会自动创建依赖项。

您可以在另一篇帖子 Using Ninject v3 in ASP.NET Web Forms 中查看这些步骤的快照演示

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2012-01-01
    • 2013-02-17
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多