.Net Core Dependency Injection injizieren von Konstruktor
Ich brauche, um zu injizieren, aus Konstruktor, der alles erklärte ich in der Setup.
Ho kann ich es tun ? Wie kann ich Spritzen Dienstleistungen aus dem Konstruktor ?
So etwas wie Injektor-service in Winkel 2.
INJIZIEREN SERVICES OHNE KONSTRUKTOR CONTROLLER
sowas
public class ControllerBase : Controller
{
protected IRepository<Test> _test;
protected IRepository<Test1> _test1;
protected IRepository<Test2> _test2;
public ControllerBase(INJECTOR injector)
{
_test = injector.inject(IRepository<Test>);
_test1 = injector.inject(IRepository<Test1>);
_test2 = injector.inject(IRepository<Test2>);
}
}
public class SomeController : ControllerBase
{
public SomeController(INJECTOR injector)
: base(injector)
{
}
}
DANK FÜR die ANTWORT @Rick van den Bosch
FÜR DIEJENIGEN, DIE IMMER NOCH NICHT BEKOMMEN, WAS ICH WOLLTE:
public class ControllerBase : Controller
{
protected IRepository<Test> _test;
protected IRepository<Test1> _test1;
protected IRepository<Test2> _test2;
public ControllerBase(IServiceProvider injector)
{
_test = injector.GetService<IRepository<Test>>();
_test1 = injector.GetService<IRepository<Test1>>();
_test2 = injector.GetService<IRepository<Test2>>();
}
}
public class SomeController : ControllerBase
{
public SomeController(IServiceProvider injector)
: base(injector)
{
//HERE I HAVE ALL 3 REPO NOW WITHOUT EXTRA LINES
}
}
public class SomeController1 : ControllerBase
{
public SomeController1(IServiceProvider injector)
: base(injector)
{
//HERE I HAVE ALL 3 REPO NOW WITHOUT EXTRA LINES
}
}
- Also, was ist die Frage hier?
- Ho kann ich es tun ? Wie kann ich Spritzen Dienstleistungen aus dem Konstruktor ?
- Haben Blick auf dieses docs.microsoft.com/en-us/aspnet/core/fundamentals/...
- Ich weiß, wie DI funktioniert und wie Sie Diensten registrieren, aber es injiziert werden kann nur in Konstruktoren ... ich brauche Injektion aus ihm heraus.
- Ich denke middleware ist fit in Ihrer Anforderung. docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware.
- Nein, nicht middleware-es geht um die Injektion, die ich brauche, um zu injizieren, Dienstleistungen OHNE KONSTRUKTOR CONTROLLER
- Was meinst du mit "injection-out"? Mindestens ein code-Beispiel wäre hilfreich, um zu verstehen, was Ihr versuchen zu erreichen.
- Eigentlich kann man Spritzen über die controller-action-Methoden-Parameter. Fügen Sie einfach
[FromServices]
vor. - thx juunas eigentlich brauche ich so etwas aber als variable, die ich Schreibe, base controller, und ich möchte zu injizieren Standard-services, ohne Sie zu deklarieren Sie im Konstruktor
- Ist es das, was du suchst? Hier ist der Weg, um die service-provider aus einem controller ohne dependency injection. "zurück.HttpContext.RequestServices.GetService<IObject>();" Leider weiß ich nicht ob es funktioniert von einem Konstruktor
- ja, ich bekam eine Antwort, aber Ihre Antwort ist die gleiche, trotzdem thx. IServiceProvider ist alles, was ich gesucht habe ))
- Ihr Beispiel anscheinend einen service locator. Sie wollen wahrscheinlich verwenden ctor-injection. Hier ist ein link, wo man Lesen kann, ein wenig über dependency injection und inversion of control, in asp.net Kern docs.microsoft.com/en-us/aspnet/core/mvc/controllers/...
- Aktuelle das Muster, das Sie zeigen, ist nicht begünstigt Komposition über Vererbung. Der code ist: "Meine Controller sind repositories für test" wenn in der Tat Sie sollten nur den direkten traffic auf die wahre repositories für den test. Modelle erstellen und nutzen starker Typ-Bindung statt. Rufen Sie die Methode im Modell/viewmodel das tut, was Sie wollen aus dem controller. Nicht implementieren der DATENZUGRIFFSSCHICHT in der Steuerung.
- überprüfen aktualisiert, Frage ich fügte Antwort, die ich bekam
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Spritzen den service als parameter an die action-Methode. Dies geschieht durch die Markierung der parameter mit dem Attribut
[FromServices]
.Diese sieht ungefähr so aus:
Wenn Sie sich für Standard-Dienste in einer BaseController: Sie gehen könnte, über das Sie verschiedene Möglichkeiten:
1. Immer noch mit einem Konstruktor
Dies würde wie folgt Aussehen:
und
Diese Weise die IDateProvider ist sowohl für den BaseController und alle erbenden Controller.
2. Beheben Dienste manuell
Auf diese Weise lösen Sie den Dienst manuell. Dies könnte in der BaseController, und nur dann, wenn Sie Sie benötigen (faul). Für mehr info, siehe dieser Beitrag.
Für Einfachheit und Lesbarkeit würde ich wahrscheinlich wählen Sie den Konstruktor ein.