Vorbei an Services mithilfe von Dependency Injection und Factory-Muster in ASP.NET
Ich bin mit ASP.NET Core, ich weiß, dass dieser Logging-Mechanismus ist bereits durch das framework, sondern mit diesem zu verdeutlichen mein problem.
Bin ich mit dem Art-Fabrik-Muster zu bauen, die Logger-Klasse, da ich nicht weiß, die Art der Protokollierung (denn es ist gespeichert in der DB).
Den ILogger Vertrag
Log(string msg)
Dann LoggerFactory zurück ILogger nach der Erstellung eines Logger basiert auf param übergeben von DB:
public class LoggerFactory
{
public static Contracts.ILogger BuildLogger(LogType type)
{
return GetLogger(type);
}
//other code is omitted, GetLogger will return an implementation of the related logger
Nun, wenn ich den Logger habe ich es zu tun auf diese Weise:
public class MyService
{
private ILogger _logger
public MyService()
{
_logger = LoggerFactory.BuildLogger("myType");
}
Aber, so werde ich meine Klassen ohne Instanziierung, ich brauche zur Verwendung von Konstruktor-DI in MyService und ich brauche, um zu injizieren, alle Abhängigkeiten auf Start:
services.AddTransient<Contracts.ILogger, LoggerFactory.BuildLogger("param") > ();
Aber das wird nicht funktionieren, diese müssen wir passieren eine konkrete Umsetzung.
Wie zu machen, dass die Arbeit mit DI gibt es einen besseren Ansatz für die Umsetzung?
LoggerFactory
statt einer ILogger
. Auf diese Weise erhalten Sie die LoggerFactory, Holen Sie sich den Typ aus der DB und bauen Ihre ILogger. Wenn Sie möchten, um zu injizieren, die ILogger müssten Sie wissen, die Art der Ihren ILogger im moment der Injektion. Aber Sie können nicht haben diese info noch nicht.Du meinst pass die LoggerFactory im MyService-Konstruktor und nicht hinzufügen .net core services
Ja. Wie diese:
services.AddSingleton<LoggerFactory>();
. Singleton bedeutet, dass Sie erstellen eine LoggerFactory Objekt nur in der ersten Zeit, die Sie brauchen. Nach dieser, Sie nutzen nur das gleiche. Sie verwenden dann so: public MyService(LoggerFactory loggerFactory) {....}
InformationsquelleAutor Hussein Salman | 2016-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Fehler in deinem Ansatz:
LoggerFactory
Art, die eine Dependency-Inversion-Prinzip Verletzung.ILogger
ist der eigentliche Dienst, Ihre Konsumenten abhängig ist. Das system ist schwieriger zu testen, schwieriger zu pflegen, und erschwert Objekt-graph-Analyse.Statt, der Dienst sollte wie folgt Aussehen:
Diese dramatisch vereinfacht alle Verbraucher, die davon abhängen
ILogger
. Dies bedeutet auch, dass immer die richtigeILogger
fürMyService
wird in der Verantwortung der Zusammensetzung Root, das ist der richtige Ort, um dieses wissen.Es bedeutet jedoch, dass Sie vielleicht brauchen, um sich von der integrierten DI-container von ASP.NET Kern zu einem mehr feature-rich-DI-Bibliothek, weil der eingebaute Behälter ist nicht in der Lage, ein context aware-Registrierung für
ILogger
während die Bibliothek von auto-Draht, der andere Konstruktor Abhängigkeiten.Mit der ASP.NET Kern DI-container, können Sie nur von hand verdrahten Sie Ihre services mit Hilfe eines Delegaten. Zum Beispiel:
MyService
, dann kann er sich ändern den Konstruktorpublic MyService(ILogger<TypeA> logger)
. Aber da er weiß das nicht, muss er Spritzen, eine Schnittstelle, die das tun können für ihn. Korrigieren Sie mich, wenn ich falsch bin.Ich bin mir nicht sicher, ob ich dir Folgen. Neben dieser, würde ich nicht raten, die Einführung einer generischen Abstraktion hier, weil
MyService
ist völlig uninteressiert in diesem generischen Typ; nur Wünsche anmelden. Es ist also ein problem der Zusammensetzung Root, um den korrekten Typ, nicht der Verbraucher.Ich verstehen Sie, dass dies nicht machbar mit ASP-Core-DI-Container, da er nicht die Zusammensetzung Root? Wenn die Antwort war ja, wie zu tun, dass die Verwendung von anderen Bibliotheken, wie Ninject oder AutoFac?
Jede Anwendung enthält eine Komposition Root. Am besten ist das ausblenden der Rahmen ist ILogger Abstraktion hinter eine anwendungsspezifische Abstraktion, wie beschrieben, hier und der Implementierung einer adapter-FRAU-Erweiterungen.Anmeldung, wie beschrieben, hier. Dokumentation erklärt, wie Draht, dieser adapter mit Einfach Injektor. Wenn Sie zu Google, wenn Sie wissen möchten, wie dieser Draht mit Ninject oder Autofac.
Sollten Sie nicht bauen Sie Ihre Objekt-Graphen basiert auf Laufzeit-Daten, nur als Sie sollten nicht konstruieren von Komponenten mit runtime-Daten. Stattdessen erstellen Sie eine proxy-Implementierung für Ihre
ILogger
Abstraktion, können rufen Sie die Datenbank und leitet den Anruf an die eigentliche Umsetzung. Auf diese Weise können Sie fügen Sie diese, ohne komplizierende VerbraucherILogger
verhindern und erschweren Ihre Zusammensetzung Root.InformationsquelleAutor Steven