使用Ninject 3在ASP.NET网站中的依赖注入

5
我尝试了在如何在 ASP.NET Web Forms 上实现 Ninject 或 DI?(Jason 的回答)中找到的以下解决方案:
  1. 创建一个新的 ASP.NET WebForms 项目
  2. 使用 NuGet 添加 Ninject.Web lib(它也将带来 Ninject.Web.Common 和 Ninject libs)
  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 在网站中工作?


请注意,断点被触发是因为调试器附加得太晚了。如果在 kernel.Bind<...>... 之前编写 Debugger.Break(),它将会触发该行代码。 - nebffa
2个回答

9

我的第一个建议是...

不要使用ASP.NET网站。 忘记它们的存在。 尽可能避免使用它们。 它们是过时的遗物,仅因为遗留原因而存在。

我的第二个建议是...

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

我的第三个建议是...

参见第一个建议。

我的第四个建议是...

如果你无法控制是否是网站项目,则放弃使用Ninject或任何其他DI容器的想法。 网站项目继承自与Web应用程序网站不同的基类集。 你无法让它以相同方式工作,并且你可能会花费太多时间来使其适应。

编辑:

基本上,代码模型在Web Sites和Web Applications之间有很大的区别。 只需看看Web Site应用程序没有命名空间,而Web Application应用程序有就可以得知这一点。 这应该告诉您它们是如此不同。

我甚至不确定两者的激活过程是否相同。

然而,话虽如此。 你的代码存在一个显著的问题。 你的页面从System.Web.UI.Page派生而来,而不是Ninject.Web.PageBase。


唉,要重新编写所有那些遗留代码的行数是相当困难的。+1 加分给幽默感。 - Andrei Drynov
@AndreiDrynov - 我是认真的。网站项目很麻烦,而且会对你施加很多限制。祝你好运。 - Erik Funkenbusch
我已经使用了你提到的那个头痛药机))) - Andrei Drynov
不要使用ASP.NET网站。忘记它们的存在。 - Steven
我差点忘了,但是我的客户要求我实现一些很棒的功能,所以我得去药店买些强力头痛药! - Rob Angelier

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

Eric,不幸的是PageBase想要看到NinjectHttpApplication,但网站不使用那个类。 - Andrei Drynov
那我怀疑你运气不好。你需要某些东西将Ninject钩到你的页面上。 - Eric King

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接