2016-07-30 36 views
1

Ich benutze Autofac in meiner Web-API, um log4net zu registrieren. Es funktioniert gut im Controller, aber wie kann ich dieselbe log4net-Instanz für gemeinsame Bibliotheksprojektklassen in derselben Lösung verwenden.wie Log4Net mit Autofac in CommonLibrary-Projekt zu verwenden

Ich habe unten Code für die Registrierung log4net mit Autofac in Web-API verwendet.

// IOC Container Setup uisng Autofac 
var builder = new ContainerBuilder(); 

// Register your Web API controllers. 
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
builder.Register(c => LogManager.GetLogger(typeof(Object))).As<ILog>(); 
builder.RegisterWebApiFilterProvider(config); 
builder.RegisterModule<AMLWebApiModule>(); 
builder.RegisterFilterProvider(); 
var container = builder.Build(); 
config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

Ich benutze Logger als eine Eigenschaft in gemeinsamen Bibliotheksprojekt. public ILog logger { get; set; }

Wenn ich versuchte, Nachricht zu protokollieren, gibt es unter Ausnahme.

Objektverweis nicht auf eine Instanz eines Objekts gesetzt.

Bitte beraten Sie, wie kann ich log4net in gemeinsamen Bibliothek Projekt verwenden.

Antwort

0

So gibt es zwei Ansätze, um diese Arbeit

1) Inject ILog in der Klassenbibliothek Projekt 2) Lösen Sie das Ilog Objekt in der Klassenbibliothek Projekt zu machen

ich für Wahl gehen würde 1) und wird alle meine Komponenten in Autofac registrieren, um DI vollständig zu nutzen und jede Komponente unabhängig zu halten.

Beispielcode,

Erstellen Sie einen Vertrag für die Klassenbibliothek Projektbeispiel

public interface Ilibrary 
{ 
    string GetName(); 
} 

public class Library : Ilibrary 
{ 
    private ILog _log; 
    public Library(ILog log) 
    { 
     _log = log; 
    } 
    public string GetName() 
    { 
     _log.Debug("log message"); 
     return "test"; 
    } 
} 

dann entweder ein Modul in dem Klassenbibliothek-Projekt erstellen und das Modul in Ihrer Anwendung Start registrieren.

Oder Sie können auch direkt registrieren, wenn Sie Zugriff auf die Konzert-Implementierung haben, nur indem Sie dies in Ihrer Anwendung starten.

builder.RegisterType<Library>() 
.AsImplementedInterfaces() 
.SingleInstance(); 
+0

Wie Klasse gegen abstrakte Klasse statt Schnittstelle registrieren? –

+0

versuche es einfach wie eine Schnittstelle, ich glaube, es sollte funktionieren. – Prashant

0

Da Sie Logger als eine Eigenschaft in Ihrem gemeinsamen Bibliothek Projekt verwenden, können Sie einfach dekorieren/annotieren diese Eigenschaft mit [Abhängigkeit] Attribute. Dies wird als Eigenschaftsinjektion bezeichnet. Ich bin mir nicht sicher, ob Sie zusätzliche Konfiguration für Abhängigkeiten der Eigenschaft injiziert in Autofac müssen, aber Sie können versuchen, wenn Sie nicht suchen können.