Heute werde ich Ihnen vorstellen, wie Sie die Abhängigkeitsinjektion in einer JSON-Datei konfigurieren.
Im vorherigen ASP.NET 4+ (MVC, Web Api, Owin, SingalR usw.) wurden proprietäre Schnittstellen für die Verwendung von Abhängigkeitsinjektionskomponenten von Drittanbietern bereitgestellt, wie z. B. unser häufig verwendetes Using Autofac, Untiy , String.Net usw. Diese Abhängigkeitsinjektionskomponenten von Drittanbietern bieten im Wesentlichen eine Reihe von Konfigurationsinjektions- oder Konfigurationslebenszyklusmethoden. Zusätzlich zur direkten Konfiguration in Klassen ermöglichen sie auch die Verwendung von XML-Dateien ., dann hat Microsoft uns im neuen ASP.NET Core standardmäßig eine Abhängigkeitsinjektionsfunktion zur Verfügung gestellt. Wir müssen uns nicht mehr auf Komponenten von Drittanbietern verlassen, um die Abhängigkeitsinjektion zu implementieren, aber manchmal möchten wir die Abhängigkeitsinjektion im konfigurieren In der Konfigurationsdatei stellt uns die DI-Komponente von Microsoft keine Konfigurationsdatei zur Verfügung, daher müssen wir die Funktion dieses Konfigurationselements selbst implementieren. Persönlich bin ich der Meinung, dass die Hauptverwendungsszenarien Orte sind, an denen die Implementierung zur Kompilierungszeit nicht bestimmt werden kann und dynamisch geändert werden muss.
Sehen wir uns an, wie das geht.
Erste Schritte
Zuerst erstellen wir in der Anwendung eine Schnittstelle für die DI-Verwendung:
public interface IFoo { string GetInputString(string input); }
Dann fügen wir eine IFoo-Implementierung hinzu Schnittstelle Foo
public class Foo : IFoo { public string GetInputString(string input) { return $"输入的字符串为:{ input }"; } }
Als nächstes müssen wir die obige IFoo-Schnittstelle und ihre Implementierung zur Methode „ConfigureServices“ in der Datei „Startup.cs“ hinzufügen. „ConfigureServices“ wird hauptsächlich zum Konfigurieren des Abhängigkeitsinjektionsdienstes verwendet . Anschließend werden Dienste über den von dieser Methode bereitgestellten ISerciceCollection-Schnittstellenparameter eingefügt.
public void ConfigureServices(IServiceCollection services) { services.Add(new ServiceDescriptor(serviceType: typeof(IFoo), implementationType: typeof(Foo), lifetime: ServiceLifetime.Transient)); }
Hier verwenden wir die Add-Methode in IServiceCollection, um eine IFoo-Implementierung mit einem vorübergehenden Lebenszyklus hinzuzufügen. Transient bedeutet, dass bei jeder Anforderung eine Instanz von Foo erstellt wird.
Das Obige ist die von Microsoft bereitgestellte Standardmethode zum Hinzufügen der Abhängigkeitsinjektion. Schauen wir uns an, wie wir sie in die Art umwandeln, die wir für die Verwendung von JSON-Dateien benötigen.
Verwenden Sie JSON-Dateien zum Konfigurieren von DI
Wenn wir JSON-Dateien zum Konfigurieren der Abhängigkeitsinjektion verwenden, können wir wählen, ob wir eine neue JSON-Datei erstellen oder direkt die Datei appsettings.json verwenden möchten. Jetzt fügen wir die DI-Konfiguration direkt zur Datei appsettings.json hinzu.
appsettings.json
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "DIServices": [ { "serviceType": "[namesapce].IFoo", "implementationType": "[namesapce].Foo", "lifetime": "Transient" } ] }
Fügen Sie zunächst einen Array-Knoten mit dem Namen „DIServices“ hinzu. Das Array enthält ein oder mehrere Objekte, die den Dienst konfigurieren. serviceType Stellt den Typ dar Die Serviceschnittstelle, die Implementierung der Implementierungstypschnittstelle und die Lebensdauer initialisieren den Lebenszyklus der Instanz.
Hinweis: Der Typ in der Konfigurationsdatei muss ein vollständiger Name sein, d. h. den Namespace enthalten.
Als nächstes fügen Sie eine Serviceklasse hinzu, die dem Json-Dateikonfigurationselement entspricht. Hier müssen wir die Newtonsoft-JSON-Bibliothek verwenden.
using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Converters; public class Service { public string ServiceType { get; set; } public string ImplementationType { get;set; } [JsonConverter(typeof(StringEnumConverter))] public ServiceLifetime Lifetime { get; set; } }
Dann müssen Sie „ConfigureServices“ ändern und die konfigurierte JSON-Datei in „ConfigureServices“ lesen.
public void ConfigureServices(IServiceCollection services) { //services.Add(new ServiceDescriptor(serviceType: typeof(IFoo), // implementationType: typeof(Foo), // lifetime: ServiceLifetime.Transient)); var jsonServices = JObject.Parse(File.ReadAllText("appSettings.json"))["DIServices"]; var requiredServices = JsonConvert.DeserializeObject<List<Service>>(jsonServices.ToString()); foreach (var service in requiredServices) { services.Add(new ServiceDescriptor(serviceType: Type.GetType(service.ServiceType), implementationType: Type.GetType(service.ImplementationType), lifetime: service.Lifetime)); } }
Anschließend testen wir, ob es verfügbar ist.
Testen
Öffnen Sie HomeController.cs und fügen Sie das Injektionselement hinzu:
public class HomeController : Controller { private readonly IFoo _foo; public HomeController(IFoo foo) { _foo = foo; } public IActionResult About() { ViewData["Message"] = _foo.GetInputString("Your application description page."); return View(); } }
Fügen Sie die IFoo-Schnittstelle im Konstruktor von HomeController hinzu und dann in Über die Verwendung in Aktion.
Führen Sie das Programm aus, öffnen Sie die Seite, klicken Sie auf die Registerkarte „Info“
Zusammenfassung
Im Folgenden erfahren Sie, wie Sie die Abhängigkeitsinjektion in ASP konfigurieren .NET Core JSON-Datei, dies ist nur ein einfaches Beispiel und sollte nicht in einer Produktionsumgebung verwendet werden. In tatsächlichen Projekten müssen Sie sich auch mit Problemen wie Ausnahmen beim Lesen der Konfiguration, der Existenz des Dienstes, dem Lebenszyklus usw. befassen.
Ausführlichere Erläuterungen zur Konfiguration der Abhängigkeitsinjektion in JSON-Dateien durch ASP.NET Core finden Sie auf der chinesischen PHP-Website für verwandte Artikel!