Wie kann ich verschiedene Implementierungen von Objekten für bestimmte Klassen einfügen?
Zum Beispiel in der Einheit kann ich:
Definieren Sie zwei Implementierungen von IRepository
und nennen Sie die benötigte Implementierung
%Vor%Wie @Tseng gezeigt hat, gibt es keine integrierte Lösung für die benannte Bindung. Die Verwendung der Factory-Methode kann jedoch für Ihren Fall hilfreich sein. Beispiel sollte wie folgt aussehen:
Erstellen Sie einen Repository-Resolver:
%Vor% Registrieren Sie benötigte Dienste in ConfigureServices.cs
Nutze es schließlich in jeder Klasse:
%Vor%Zusätzlich zu @ adem-caglin antwort möchte ich hier einen wiederverwendbaren Code veröffentlichen, den ich für namenbasierte Registrierungen erstellt habe.
AKTUALISIEREN Jetzt ist es als nuget-Paket verfügbar.
Um Ihre Dienste zu registrieren, müssen Sie Ihrer Startup
-Klasse folgenden Code hinzufügen:
Dann können Sie es über IServiceByNameFactory
interface:
Der vollständige Code der Erweiterung ist in github .
Sie können nicht mit dem integrierten ASP.NET Core IoC Container.
Dies ist nach Design . Der integrierte Container wird absichtlich einfach und leicht erweiterbar gehalten, sodass Sie Drittanbieter-Container anschließen können, wenn Sie mehr Funktionen benötigen.
Sie müssen dazu einen Container von Drittanbietern verwenden, wie Autofac (siehe Dokumente ).
%Vor%Nachdem ich die offizielle Dokumentation zur Abhängigkeitsinjektion gelesen habe, denke ich nicht Sie können es auf diese Weise tun.
Aber meine Frage ist: Brauchen Sie diese beiden Implementierungen gleichzeitig? Wenn Sie dies nicht tun, können Sie mehrere Umgebungen über Umgebungsvariablen erstellen und spezifische Funktionalität in der Startup
-Klasse basierend auf der aktuellen Umgebung. oder sogar mehrere% erstellen co_de%.
Wenn eine ASP.NET Core-Anwendung gestartet wird, wird die Klasse
Startup{EnvironmentName}
verwendet, um die Anwendung zu starten, ihre Konfigurationseinstellungen zu laden usw. (weitere Informationen zum Starten von ASP.NET). Wenn jedoch eine Klasse namensStartup
(z. B.Startup{EnvironmentName}
) vorhanden ist und die UmgebungsvariableStartupDevelopment
mit diesem Namen übereinstimmt, wird stattdessen die KlasseASPNETCORE_ENVIRONMENT
verwendet. Daher könnten SieStartup
für die Entwicklung konfigurieren, aber ein separatesStartup
, das verwendet wird, wenn die App in der Produktion ausgeführt wird. Oder umgekehrt.
Ich habe auch einen Artikel über das Injizieren von Abhängigkeiten aus einer JSON-Datei geschrieben Sie müssen also nicht jedes Mal die gesamte Anwendung neu kompilieren, wenn Sie zwischen den Implementierungen wechseln möchten. Im Grunde behalten Sie ein JSON-Array mit Diensten wie diesem:
%Vor%Dann können Sie die gewünschte Implementierung in dieser Datei ändern und müssen keine Umgebungsvariablen neu kompilieren oder ändern.
Hoffe, das hilft!
Tags und Links c# dependency-injection asp.net-core