【问题标题】:Dependency Injection with Ninject 3 in ASP.NET web site在 ASP.NET 网站中使用 Ninject 3 进行依赖注入
【发布时间】:2012-05-03 14:26:08
【问题描述】:

我尝试了在How can I implement Ninject or DI on asp.net Web Forms?(Jason 的回答)中找到的以下解决方案

  1. 创建一个新的 ASP.NET WebForms 项目
  2. 使用 NuGet 添加 Ninject.Web 库(这也会关闭 Ninject.Web.Common 和 Ninject 库)
  3. 在 App_Start / NinjectWebCommon.cs / RegisterServices 方法中注册您的自定义绑定
  4. 在您的页面上使用属性注入

在 ASP.NET Web 应用程序中表现出色。

问题是我想在 ASP.NET 网站中使用 Ninject for DI,而不是 Web 应用程序。

我在 NinjectWebCommon / RegisterServices 中注册了自定义绑定:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ITestRepository>().To<TestRepository>();
}

我在一个网页中注入它:

public partial class _Default : System.Web.UI.Page
{
    [Inject]
    public ITestRepository _repository { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        System.Diagnostics.Trace.WriteLine(_repository.ExecuteOperation());
    }
}

它总是抛出一个空引用异常,并且永远不会到达 NinjectWebCommon.cs 中的断点——这与 Web 应用程序不同。

还应该做​​些什么才能让 Ninject 3 在网站上运行?

【问题讨论】:

  • 注意断点被命中是因为调试器连接得太晚了。如果你在kernel.Bind&lt;...&gt;... 之前写Debugger.Break(),它将到达那一行。

标签: asp.net dependency-injection ninject


【解决方案1】:

我给你的第一个建议是……

不要使用 ASP.NET 网站。忘记他们的存在。不惜一切代价避免它们。它们是对过去时代的不合时宜的回归,只是由于遗留原因而仍然存在。

我的第二条建议是......

如果您坚持继续使用网站项目,请大量投资头痛药,因为您将需要它。

我的第三条建议是......

查看第一个建议。

我的第四条建议是……

如果您完全无法控制它是否是网站项目,那么请放弃使用 Ninject 或任何其他 DI 容器的想法。网站项目继承自一组不同于 Web 应用程序站点的基类。你不会让它以同样的方式工作,而且你可能会花费太多时间来让它适应。

编辑:

基本上,代码模型在网站和 Web 应用程序之间的工作方式非常不同。您只需看看 Web 应用程序没有名称空间而 Web 应用程序有名称空间这一事实。这应该可以告诉您它们之间的差异有多大。

我不完全确定激活过程在两者中是否相同。

不过,说了这么多。您的代码存在明显问题。您的页面派生自 System.Web.UI.Page 而不是 Ninject.Web.PageBase

【讨论】:

  • 幽默+1。唉,要重写所有这些遗留代码行会很困难。
  • @AndreiDrynov - 我是认真的。网站项目是地狱,它们对你施加了很多限制。祝你好运。
  • 你说的那个头痛药机我已经用过了)))
  • “不要使用 ASP.NET 网站。忘记它们的存在。”。为此 +1000。
  • 我差点忘了,但后来我石器时代的客户要求我实现一些很棒的功能,然后去药房买一些强效头痛药!
【解决方案2】:

根据您链接到的另一个问题,您需要您的页面从Ninject.Web.PageBase 继承。您的页面似乎继承自 System.Web.UI.Page,它不知道如何注入您的依赖存储库。

【讨论】:

  • Eric,不幸的是 PageBase 想看到 NinjectHttpApplication ,但是网站不使用那个类
  • 那我怀疑你运气不好。您需要 something 将 Ninject 挂接到您的页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多