我在How can I implement Ninject or DI on asp.net Web Forms?(杰森的回答)
中尝试了以下解决方案在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在网站上运行还需要做些什么?
答案 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
,它不知道如何注入您的依赖存储库。