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?

Eine Möglichkeit ist, injizieren Sie die 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

Schreibe einen Kommentar