Utilizando Autofac para inyectar log4net en el controlador
Intento usar Autofac para inyectar una clase log4net en mi controlador, pero obtengo la siguiente excepción:
Ninguno de los constructores encontrados con 'Banderas de enlace público' en el tipo 'MvcApplication6.Controllers.HomeController' se puede invocar con los servicios y parámetros disponibles: No se puede resolver el parámetro 'log4net.ILog logger' del constructor 'Void .ctor (log4net.ILog ) '.
He creado un módulo para inyectar laLog
clase usando el tipo correcto:
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))
});
}
}
uego registro el módulo dentro de mi ASP.NET MVCApplication_Start
método:
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);
}
He agregado un constructor al controlador que toma unILog
como parámetro:
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();
}
}
}
Estoy seguro de que he perdido un paso, por lo que agradecería cualquier ayuda.