我试图使用依赖解析器在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();
你在这里错过了一些关键信息;你的绑定是如何设置的以及初始者的'DependencyResolver'在哪里... – khellang 2013-02-26 23:00:40
我正在使用_Ninject.MVC3_,我相信需要设置DependencyResolver(我不会在任何地方手动执行)。 我也没有指定ILogger的绑定。我正在使用_Ninject.Extension.Logging.Log4net_,这似乎是为我绑定它。正如我所说,ILogger通过构造函数注入完美工作。 – Matt 2013-02-26 23:24:31