我有一个使用ASP.NET 2.0的NINObject3.5 WebForms应用程序。然而,在尝试使用Ninject.Web扩展来提供对System.Web.UI.Page的注入时,我得到的注入依赖项的引用为空,即使我切换到使用服务定位器来提供引用(使用Ninject.Web),也没有问题。
我的配置(简化为简单起见):
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
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;
}。。
..。
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IClubRepository>().To<ClubRepository>();
//...
}
}通过服务定位器获取IClubRepository具体实例运行良好(使用相同的"MyModule")。也就是说。
private readonly IClubRepository _repository = Core.Infrastructure.IoC.TypeResolver.Get<IClubRepository>();我遗漏了什么?
更新最终回到了这一点,它在Classic Pipeline模式下工作,但不是集成模式。经典的流水线是必需的吗?
更新2连接我的OnePerRequestModule是问题所在(为了清楚起见,上面的例子中删除了这个问题):
protected override IKernel CreateKernel()
{
var module = new OnePerRequestModule();
module.Init(this);
IKernel kernel = new StandardKernel(new MyModule());
return kernel;
}...needs目标:
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel(new MyModule());
var module = new OnePerRequestModule();
module.Init(this);
return kernel;
}这就解释了为什么我在集成的流水线下会得到一个空引用异常(对于一个注入的依赖,或者仅仅是一个从Ninject.Web.PageBase继承的页面的页面加载--不管是先来的)。
发布于 2010-03-02 05:47:16
这是相当令人费解的,因为据我所知,您似乎已经正确配置了所有内容。从你得到的是一个空引用异常而不是一个ActivationException的事实来看,页面级注入似乎并没有发生。通常,这是由于注入的属性的保护级别所致,但根据您的代码,不存在任何问题。以下是您可以尝试帮助跟踪此问题的一些情况:
对Kernel.Inject()的调用是在PageBase类的PageBase方法中完成的,该调用启动了对Ninject的属性注入。如果由于某种原因,这个方法没有被执行,它可能会导致您看到的问题。您可以通过覆盖RequestActivation()方法进行进一步的研究,该方法是被调用来执行实际注入的方法(请确保调用base.RequestActivation())。如果你的覆盖从未被调用过,那么OnInit就有问题。
MyModule());
这就是我目前所了解到的全部内容。就像我说的,从这里看,你已经把所有的鸭子都穿好了,排成了一排,所以它们应该是在工作的……
祝你好运,追踪这个问题。
发布于 2010-05-04 18:56:04
这可能不是特定于Ninject的。在没有IoC的情况下,我可以在集成模式下运行相同的异常。我只有一个简单的asp.net应用程序,只包含一个没有逻辑的aspx页面。
在我的global.asax文件中,我有以下内容:
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的荣誉:(
https://stackoverflow.com/questions/2358137
复制相似问题