【问题标题】:Resolving Ninject ILogger in Global.asax解决 Global.asax 中的 Ninject ILogger
【发布时间】:2013-02-26 22:44:42
【问题描述】:

我正在尝试使用 MVC4 项目的 global.asax 中的依赖关系解析器来获取对 Ninject.Extensions.Logging.ILogger 的引用,但它是抛出 NullReferenceException。我在项目的其他地方使用构造函数注入来获取 ILogger 的实例,并且可以完美运行。

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 在哪里...
  • 我正在使用 Ninject.MVC3,我相信它负责设置 DependencyResolver(我不会在任何地方手动进行)。我也没有为 ILogger 指定绑定。我正在使用 Ninject.Extension.Logging.Log4net,这似乎对我有约束力。正如我所说,ILogger 通过构造函数注入完美地工作。

标签: c# .net asp.net-mvc ninject global-asax


【解决方案1】:

您不能 Get&lt;&gt;ILogger 因为在这种情况下它不会被注入任何地方并且无法评估类型。你有两个选择:

  1. 属性将记录器注入全局 asax
  2. 或者更好地实现 IHttpModule 并注册 Application.EndRequest 事件。在这里你可以进行构造函数注入

【讨论】:

  • 我选择在 HTTP 模块中实现所需的功能,并按照您的建议为 ILogger 注入构造函数。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多