Пытаюсь использовать Autofac для внедрения класса log4net в мой контроллер, но получаю следующее исключение:
Ни один из конструкторов, обнаруженных с «общедоступными флагами привязки» для типа «MvcApplication6.Controllers.HomeController», не может быть вызван с доступными службами и параметрами: Невозможно разрешить параметр «log4net.ILog logger» конструктора «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))
});
}
}
Затем я регистрирую модуль в моем методе Application_Start
ASP.NET MVC:
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();
}
}
}
Я уверен, что пропустил шаг, поэтому будем благодарны за любую помощь.