2017-03-24 5 views
0

Ist es möglich, ASP.NET Core DI zu konfigurieren, um alle Klassen aufzulösen? Ähnlich wie Autofac AnyConcreteTypeNotAlreadyRegisteredSource-Funktionalität.ASP.NET Core löst automatisch alle Abhängigkeiten

Ich kann Autofac in ASP.NET Core verwenden, aber ich möchte keine zusätzliche Bibliothek zu meiner Anwendung hinzufügen, weil ASP.NET Core bereits DI hat.

Also im Grunde statt:

services.AddTransient<MyService>(); 
services.AddTransient<MyAnotherService>(); 

Ich würde es vorziehen, so etwas wie zu tun:

services.ResolveAll(); 
+1

Ich nehme an, es könnte getan werden, aber es gibt nicht schon einen bequemen Anruf, um es zu tun. Ich bin neugierig, was Ihr bestimmter Anwendungsfall dafür ist. Was versuchst du zu erreichen und warum denkst du, dass dies der beste Weg ist? –

+0

@ErikNoren ist, wie ich normalerweise DI verwende. Ich bevorzuge keine dummen Schnittstellen. Wenn ich also nur eine Implementierung brauche, erstelle ich eine Klasse anstelle von Interface und Klasse (um Test-Frameworks oder DI-Frameworks glücklich zu machen). Und fast alle Projekte benötigen für einige Funktionen nicht mehrere Implementierungen. Also, wenn ich eine "Foo" -Klasse spritzen möchte, dann ist es nur "Foo" -Klasse, die ich habe. Und mein Ziel ist, DI überhaupt nicht zu konfigurieren. Eigentlich benutze ich Autofac für diese 'builder.RegisterSource (new AnyConcreteTypeNotAlreadyRegisteredSource());' –

Antwort

3

ASP.NET Core-DI nicht unterstützt die automatische Erkennung und automatische Registrierung und dort ist nicht geplant, diese Features hinzuzufügen (zumindest in der Nähe von Feature).

Der Hauptgrund ist, dass das .NET Core-Team versucht, den integrierten Container so einfach wie möglich zu halten und eine einfache/direkte Methode zum Hinzufügen weiterer DI-Container zu speichern.

Verwandte SO Frage: Property Injection in Asp.Net Core

0

es scheint, dass wir diese allgemeine automatische Injektion Konzept mit ein wenig Nachdenken beginnen nach unten kann

i auf „Provider“ Namespace gefiltert haben und suchen nach Klassennamen buchstabiert das gleiche wie Schnittstellen sans "I", aber natürlich Saison zu Ihrem eigenen Geschmack

(dieser Code funktioniert unter einem asp.net Kern 2.0 Kontext)

var allProviderTypes = System.Reflection.Assembly.GetExecutingAssembly() 
    .GetTypes().Where(t=>t.Namespace != null && t.Namespace.Contains("Providers")); 

    foreach(var intfc in allProviderTypes.Where(t=>t.IsInterface)) { 
    var impl = allProviderTypes.FirstOrDefault(c=>c.IsClass && intfc.Name.Substring(1) == c.Name); 
    if (impl != null) services.AddScoped(intfc, impl); 
    } 
+0

danke für die Freigabe, aber die Frage war über einige Build-in-Methode. Ich überprüfe nicht, ob es in 2.0 möglich ist, aber es sieht so aus. –