使用autofacc将log4net注入控制器

本文关键字:注入 控制器 log4net autofacc 使用 | 更新日期: 2023-09-27 18:04:07

试图使用autofacc注入一个log4net类到我的控制器,但我得到以下异常:

没有找到带有"公共绑定标志"的构造函数"MvcApplication6.Controllers类型。HomeController'可以用可用的服务和参数调用:无法解析参数'log4net '。'Void .ctor(log4net.ILog)'.

我已经创建了一个模块,使用正确的类型注入Log类:

public class LogInjectionModule : Module
{
    protected override void AttachToComponentRegistration(IComponentRegistry registry, IComponentRegistration registration)
    {
         registration.Preparing += OnComponentPreparing;
    }
    static void OnComponentPreparing(object sender, PreparingEventArgs e)
    {
        var t = e.Component.Activator.LimitType;
        e.Parameters = e.Parameters.Union(new[] 
        { 
            new ResolvedParameter((p, i) => p.ParameterType == typeof(ILog), (p, i) => LogManager.GetLogger(t)) 
        });
    }
}

然后在我的ASP中注册模块。. NET MVC Application_Start方法:

protected void Application_Start()
{
     ContainerBuilder builder = new ContainerBuilder();
     builder.RegisterControllers(typeof (MvcApplication).Assembly) ;
     var container = builder.Build() ;
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     builder.RegisterModule(new LogInjectionModule());
     AreaRegistration.RegisterAllAreas();
     RegisterGlobalFilters(GlobalFilters.Filters);
     RegisterRoutes(RouteTable.Routes);
}

我在控制器中添加了一个构造函数,它以ILog为参数:

namespace MvcApplication6.Controllers
{
   public class HomeController : Controller
   {
      ILog _log;
      public HomeController(ILog logger) 
      {
         _log = logger;
      }
      public ActionResult Index()
      {
         ViewBag.Message = "Welcome to ASP.NET MVC!";
         _log.Info("Log message from Index()");
         return View();
      }
      public ActionResult About()
      {
         _log.Info("Log message from About()");
         return View();
      }
   }
}

我确定我错过了一个步骤,所以任何帮助都将是感激的。

使用autofacc将log4net注入控制器

我不确定这是否会导致您的问题,但您应该尝试在调用builder.Build();

之前将模块添加到ContainerBuilder

像这样:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterControllers(typeof (MvcApplication).Assembly) ;
builder.RegisterModule(new LogInjectionModule());
var container = builder.Build() ;
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
另一个建议是不注入记录器。通常,当我设计一个类时,我试图用构造函数依赖来表达我正在建模的组件的逻辑业务依赖。日志记录主要是与应用程序无关的实现细节。至少在log4net中,您可以在任何需要使用LogManager.GetLogger(type)创建日志记录的类中拥有静态成员。为了方便添加日志记录器,您可以使用Visual Studio代码段。