ASP.NET网站中使用Ninject 3进行依赖注入

时间:2012-04-22 22:31:54

标签: asp.net dependency-injection ninject

我在How can I implement Ninject or DI on asp.net Web Forms?(杰森的回答)

中尝试了以下解决方案
  1. 创建新的ASP.NET WebForms项目
  2. 使用NuGet添加Ninject.Web库(这也将关闭Ninject.Web.Common和Ninject库)
  3. 在App_Start / NinjectWebCommon.cs / RegisterServices方法中注册自定义绑定
  4. 在您的网页上使用属性注入
  5. 在ASP.NET Web应用程序中运行良好。

    问题是我想在ASP.NET 网站中使用Ninject进行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在网站上运行还需要做些什么?

2 个答案:

答案 0 :(得分:10)

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

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

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

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

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

见第一建议。

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

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

编辑:

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

我并不完全确定激活过程在两者中都是一样的。

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

答案 1 :(得分:1)

根据您关联的其他问题,您需要从Ninject.Web.PageBase继承您的网页。您的页面似乎继承自System.Web.UI.Page,它不知道如何注入您的依赖存储库。