Mit Autofac zu injizieren log4net in die Steuerung
Versuchen mit Autofac zu injizieren log4net-Klasse in meinem controller, aber ich bekomme die folgende exception:
Keiner der Konstrukteure gefunden, die mit 'Public binding-flags' auf
Typ 'MvcApplication6.Controller.HomeController "kann aufgerufen werden, mit der die verfügbaren Dienste und Parameter: Nicht beheben können parameter" log4net.ILog Datenlogger' Konstruktor 'Void .ctor(log4net.ILog)'.
Habe ich erstellt ein Modul zum einfügen des Log
Klasse mit dem korrekten Typ:
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))
});
}
}
Ich dann registrieren Sie das Modul in meinem ASP.NET MVC Application_Start
Methode:
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);
}
Ich habe eine constuctor an die Steuerung, die dauert eine ILog
als parameter:
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();
}
}
}
Ich bin sicher, dass ich verpasst haben, ein Schritt, so dass jede Hilfe wäre sehr geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, ob dies die Ursache Ihres Problems, sondern Sie sollten versuchen, fügen Sie das Modul, um die ContainerBuilder vor Aufruf-generator.Build();
Etwas wie dieses:
Ein weiterer Vorschlag ist, um nicht injiziert der logger. In der Regel, wenn ich das design einer Klasse mit Konstruktor Abhängigkeiten ich auszudrücken versuche die logische business-Abhängigkeiten der Komponente bin ich Modellierung. Anmeldung ist meist eine Implementierung detail, die orthogonal zu der Anwendung. Zumindest mit log4net Sie können einen statischen member in einer Klasse wo Sie Sie brauchen, die Protokollierung, die erstellt wird, mit LogManager.GetLogger(Typ). Zur Erleichterung der addition der logger können Sie eine Visual Studio-snippet.