5

我尝试了如何在 asp.net Web 窗体上实现 Ninject 或 DI中找到的以下解决方案?(杰森的回答)

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

在 ASP.NET Web 应用程序中运行良好。

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

我在 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 在网站上运行,还应该做些什么?

4

2 回答 2

10

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

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

我的第二条建议是……

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

我的第三条建议是……

请参阅第一个建议。

我的第四条建议是……

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

编辑:

基本上,代码模型在网站和 Web 应用程序之间的工作方式非常不同。您只需看看网站应用程序没有名称空间,而 Web 应用程序应用程序有这个事实。这应该告诉你这些有多么不同。

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

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

于 2012-04-22T22:42:41.047 回答
1

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

于 2012-04-22T23:00:12.007 回答