Использование Autofac для внедрения log4net в контроллер

Попытка использовать Autofac для внедрения класса log4net в мой контроллер, но я получаю следующее исключение:

Ни один из конструкторы найдены с помощью 'Public binding flags' на Тип '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)) 
        });
    }
}

Затем я регистрирую модуль в моем методе 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();
      }
   }
}

Я уверен, что пропустил какой-то шаг, поэтому любая помощь будет принята с благодарностью.

7
задан Jørn Schou-Rode 6 February 2013 в 12:46
поделиться