Abhängigkeitsinjektion, die nach Namen aufgelöst wird

8

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

%Vor%

und nennen Sie die benötigte Implementierung

%Vor%     
Ilya.Sulimanov 22.08.2016, 05:37
quelle

4 Antworten

11

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

%Vor%

Nutze es schließlich in jeder Klasse:

%Vor%     
adem caglin 22.08.2016, 06:51
quelle
6

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:

%Vor%

Dann können Sie es über IServiceByNameFactory interface:

verwenden %Vor%

Der vollständige Code der Erweiterung ist in github .

    
neleus 01.09.2016 16:09
quelle
1

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%     
Tseng 22.08.2016 06:20
quelle
1

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 namens Startup (z. B. Startup{EnvironmentName} ) vorhanden ist und die Umgebungsvariable StartupDevelopment mit diesem Namen übereinstimmt, wird stattdessen die Klasse ASPNETCORE_ENVIRONMENT verwendet. Daher könnten Sie Startup für die Entwicklung konfigurieren, aber ein separates Startup , 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!

    
radu-matei 22.08.2016 06:27
quelle