2013-02-26 36 views
1

我试图使用依赖解析器在MVC4项目的Global.asax得到一个参考Ninject.Extensions.Logging.ILogger,但它抛出一个NullReferenceException。我在项目的其他地方使用构造函数注入来获取ILogger的实例,并且该工作完美无瑕。解决Ninject ILogger在Global.asax中

protected void Application_EndRequest() 
{ 
    if (Context.Response.StatusCode == 404) 
    { 
     Response.Clear(); 

     var rd = new RouteData(); 
     rd.Values["controller"] = "Error"; 
     rd.Values["action"] = "NotFound"; 

     //this line throws a NullReferenceException with the stack track below 
     var logger = DependencyResolver.Current.GetService<ILogger>(); 

     IController c = new ErrorController(logger); 
     c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
    } 
} 

at Ninject.Extensions.Logging.LoggerFactoryBase.GetLogger(IContext context) in c:\Projects\Ninject\ninject.extensions.logging\src\Ninject.Extensions.Logging\LoggerFactoryBase.cs:line 61 
at Ninject.Extensions.Logging.LoggerModuleBase.<Load>b__0(IContext context) in c:\Projects\Ninject\ninject.extensions.logging\src\Ninject.Extensions.Logging\LoggerModuleBase.cs:line 26 
at Ninject.Activation.Providers.CallbackProvider`1.CreateInstance(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\CallbackProvider.cs:line 45 
at Ninject.Activation.Provider`1.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Provider.cs:line 38 
at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 
at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) 
at Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType) in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:line 56 
at System.Web.Mvc.DependencyResolverExtensions.GetService[TService](IDependencyResolver resolver) 
at My.WebApp.MvcApplication.Application_EndRequest() in c:\Dev\Project\My.WebApp\Global.asax.cs:line 92 

如果我用下面的代替DependencyResolver行,它行得通,但可以创建多个Kernel实例吗?

var kernel = new StandardKernel(); 
ILoggerFactory loggerFactory = kernel.Get<ILoggerFactory>(); 
var logger = loggerFactory.GetCurrentClassLogger(); 
+0

你在这里错过了一些关键信息;你的绑定是如何设置的以及初始者的'DependencyResolver'在哪里... – khellang 2013-02-26 23:00:40

+0

我正在使用_Ninject.MVC3_,我相信需要设置DependencyResolver(我不会在任何地方手动执行)。 我也没有指定ILogger的绑定。我正在使用_Ninject.Extension.Logging.Log4net_,这似乎是为我绑定它。正如我所说,ILogger通过构造函数注入完美工作。 – Matt 2013-02-26 23:24:31

回答

2

您不能Get<>的​​因为在这种情况下,它不是任何地方注入类型无法评估。你有两个选择:

  1. 房产注入到记录器全球ASAX
  2. 或者更好实施的IHttpModule并注册了Application.EndRequest事件。在这里你可以做构造注入
+0

我选择在HTTP模块中实现所需的功能,并按照您的建议使用ILogger的构造函数注入。谢谢! – Matt 2013-02-28 21:47:31

相关问题