Die Injektion mehrere Implementierungen mit Dependency injection

Ich bin momentan an einem ASP.NET Kern-Projekt und wollen, verwenden Sie die integrierte Dependency Injection (DI) - Funktionalität.

Gut, angefangen habe ich mit einem interface:

ICar
{
    string Drive();
}

und umsetzen wollen, die ICar - Schnittstelle, die mehrere Male wie

public class BMW : ICar
{
    public string Drive(){...};
}

public class Jaguar : ICar
{
    public string Drive(){...};
}

und fügen Sie den folgenden in der Startup Klasse

public void ConfigureServices(IServiceCollection services)
{
     //Add framework services.
     services.AddMvc();
     services.AddTransient<ICar, BMW>(); 
     //or 
     services.AddTransient<ICar, Jaguar>();
 }

Nun muss ich eine Entscheidung zwischen beiden Implementierungen und meine Klasse entschieden wird in jedem Konstruktor muss ein ICar Umsetzung. Aber meine Idee war zu sagen, wenn der angeforderte Controller ist BMWController, dann verwenden Sie BMW-Implementierung oder verwenden Sie Jaguar-wenn die JaguarController angefordert.

Sonst DI machen keinen Sinn für mich. Wie kann ich damit umgehen, richtig?

Zum besseren Verständnis mein problem werfen Sie einen Blick auf dieses Bild: https://media-www-asp.azureedge.net/media/44907/dependency-injection-golf.png?raw=true
Wie funktioniert die dependency resolver arbeiten und wo kann ich es einrichten in ASP.NET Core?

In der Einheit es ist möglich, etwas wie dies
container.RegisterType<IPerson, Male>("Male");
container.RegisterType<IPerson, Female>("Female");

und nennen Sie die richtige Art, wie diese

[Dependency("Male")]IPerson malePerson
  • Ich denke, dass die Idee falsch ist. Wenn Sie BMWController, die braucht konkrete Auto-Implementierung injizieren von ICar hat keinen Sinn, dass die Magie von DI - Sie sagen: "gimme Umsetzung der Ikar" und egal, was es ist. Ich würde bereiten Sie eine separate Schnittstelle: interface IBmwCar: ICar { ... } und injizieren es in BMWController. Andere Idee ist, erstellen Sie factory. f.e class CarFactory : ICarFactory { ICar GimmeCar<TController>() } wo Sie zugeordnet haben, controller-Typ um die konkrete Umsetzung.
  • Danke für die Antwort.
  • Ist es nicht ein überlauf-Schnittstellen, wenn ich die user so etwas wie IBmwCar : ICar für alle Marken, die ich umsetzen will? Ich habe nur die Festplatte als Methode und nicht irgendeine andere. Naja, ich würde dann IBMW, IJaguar... mit der gleichen Signatur wie das ICar und und mit einer Anweisung, wie diese für jede Marke, die ich umgesetzt haben: die Dienstleistungen.AddTransient<IJaguar, Jaguar>(); Natürlich könnte ich mit Factory-Muster, aber gibt es nicht irgendeine Lösung, um meine Arbeit zu tun, mit DI?
  • eine Sache, über die DI ist, können Sie eine Abhängigkeit IEnumerable<ICar> und alle Implementierungen, die registriert wurden, wenn keine Implementierungen registriert haben, erhalten Sie eine leere Liste, anstatt einen Fehler zu beheben. Also, wenn Ikar hat eine id-Eigenschaft, die Sie finden konnte, die Sie brauchen in der Liste.
Schreibe einen Kommentar