首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ninject.Web.PageBase仍然导致对注入依赖项的空引用

Ninject.Web.PageBase仍然导致对注入依赖项的空引用
EN

Stack Overflow用户
提问于 2010-03-02 02:41:10
回答 2查看 2.3K关注 0票数 5

我有一个使用ASP.NET 2.0的NINObject3.5 WebForms应用程序。然而,在尝试使用Ninject.Web扩展来提供对System.Web.UI.Page的注入时,我得到的注入依赖项的引用为空,即使我切换到使用服务定位器来提供引用(使用Ninject.Web),也没有问题。

我的配置(简化为简单起见):

代码语言:javascript
复制
public partial class Default : PageBase // which is Ninject.Web.PageBase
{
    [Inject]
    public IClubRepository Repository { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        var something = Repository.GetById(1); // results in null reference exception.
    }
 }

... //global.asax.cs

代码语言:javascript
复制
public class Global : Ninject.Web.NinjectHttpApplication
{
    /// <summary>
    /// Creates a Ninject kernel that will be used to inject objects.
    /// </summary>
    /// <returns>
    /// The created kernel.
    /// </returns>
    protected override IKernel CreateKernel()
    {
        IKernel kernel =
        new StandardKernel(new MyModule());
        return kernel;

    }

。。

..。

代码语言:javascript
复制
public class MyModule : NinjectModule
{
    public override void Load()
    {
        Bind<IClubRepository>().To<ClubRepository>();
        //...
    }
}

通过服务定位器获取IClubRepository具体实例运行良好(使用相同的"MyModule")。也就是说。

代码语言:javascript
复制
  private readonly IClubRepository _repository = Core.Infrastructure.IoC.TypeResolver.Get<IClubRepository>();

我遗漏了什么?

更新最终回到了这一点,它在Classic Pipeline模式下工作,但不是集成模式。经典的流水线是必需的吗?

更新2连接我的OnePerRequestModule是问题所在(为了清楚起见,上面的例子中删除了这个问题):

代码语言:javascript
复制
    protected override IKernel CreateKernel()
    {
        var module = new OnePerRequestModule();
        module.Init(this);

        IKernel kernel = new StandardKernel(new MyModule());

        return kernel;
    }

...needs目标:

代码语言:javascript
复制
    protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new MyModule());

        var module = new OnePerRequestModule();
        module.Init(this);

        return kernel;
    }

这就解释了为什么我在集成的流水线下会得到一个空引用异常(对于一个注入的依赖,或者仅仅是一个从Ninject.Web.PageBase继承的页面的页面加载--不管是先来的)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-02 05:47:16

这是相当令人费解的,因为据我所知,您似乎已经正确配置了所有内容。从你得到的是一个空引用异常而不是一个ActivationException的事实来看,页面级注入似乎并没有发生。通常,这是由于注入的属性的保护级别所致,但根据您的代码,不存在任何问题。以下是您可以尝试帮助跟踪此问题的一些情况:

对Kernel.Inject()的调用是在PageBase类的PageBase方法中完成的,该调用启动了对Ninject的属性注入。如果由于某种原因,这个方法没有被执行,它可能会导致您看到的问题。您可以通过覆盖RequestActivation()方法进行进一步的研究,该方法是被调用来执行实际注入的方法(请确保调用base.RequestActivation())。如果你的覆盖从未被调用过,那么OnInit就有问题。

  1. InjectAttribute是在默认的内核配置中设置的,所以不应该有任何需要指定它,但是如果你想额外确定,你可以通过如下操作在你的内核设置中设置属性映射:

MyModule());

  • The内核=新类型(新类型{ InjectAttribute =StandardKernel(InjectAttribute) },PageBase类用于注入的新CreateKernel内核实例(同样,应该由Global.asax.cs中的CreateKernel覆盖实例化的实例)存储在Ninject.Web.KernelContainer中的服务定位器类型对象中。我将确保您可以在KernelContainer上看到内核属性,并且Page_Load方法中的该属性不为null。

这就是我目前所了解到的全部内容。就像我说的,从这里看,你已经把所有的鸭子都穿好了,排成了一排,所以它们应该是在工作的……

祝你好运,追踪这个问题。

票数 2
EN

Stack Overflow用户

发布于 2010-05-04 18:56:04

这可能不是特定于Ninject的。在没有IoC的情况下,我可以在集成模式下运行相同的异常。我只有一个简单的asp.net应用程序,只包含一个没有逻辑的aspx页面。

在我的global.asax文件中,我有以下内容:

代码语言:javascript
复制
public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        this.EndRequest += new EventHandler(Global_EndRequest);
    }

    void Global_EndRequest(object sender, EventArgs e)
    {
        // do stuff
    }

基本上,在集成管道模式下运行时,订阅application_start中的事件会导致此异常。切换到传统流水线或删除事件订阅和处理程序会使错误消失。我在64位Win7企业版上运行IIS7.5。

这可能不能解决你的特定问题,但我在这里发帖,因为这是当我将异常粘贴到google时出现的唯一页面!当我被允许提问时,我会将我的回答转移到另一个单独的问题中。我还没有stackoverflow的荣誉:(

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2358137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档