Ich möchte Dependency Injection (DI) in ASP.NET Core implementieren . Nach dem Hinzufügen dieses Codes zur ConfigureServices
Methode funktionieren beide Möglichkeiten.
Was ist der Unterschied zwischen den Methoden services.AddTransient
und service.AddScoped
in ASP.NET Core?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddScoped<IEmailSender, AuthMessageSender>();
}
c#
asp.net-core
.net-core
Elvin Mammadov
quelle
quelle
Antworten:
TL; DR
Zur Verdeutlichung zeigt dieses Beispiel aus der ASP.NET-Dokumentation den Unterschied:
Um den Unterschied zwischen diesen Lebensdauer- und Registrierungsoptionen zu demonstrieren, betrachten Sie eine einfache Schnittstelle, die eine oder mehrere Aufgaben als Vorgang mit einer eindeutigen Kennung darstellt
OperationId
. Abhängig davon, wie wir die Lebensdauer für diesen Dienst konfigurieren, stellt der Container der anfordernden Klasse entweder die gleichen oder verschiedene Instanzen des Dienstes zur Verfügung. Um zu verdeutlichen, welche Lebensdauer angefordert wird, erstellen wir einen Typ pro Lebenszeitoption:Wir implementieren diese Schnittstellen mit einer einzelnen Klasse,
Operation
die eine GUID in ihrem Konstruktor akzeptiert, oder verwenden eine neue GUID, wenn keine angegeben ist:Als Nächstes wird
ConfigureServices
jeder Typ entsprechend seiner benannten Lebensdauer zum Container hinzugefügt:Beachten Sie, dass der
IOperationSingletonInstance
Dienst eine bestimmte Instanz mit einer bekannten ID von verwendetGuid.Empty
, sodass klar ist, wann dieser Typ verwendet wird. Wir haben auch eine registriertOperationService
, die von jedem der anderenOperation
Typen abhängt , sodass innerhalb einer Anfrage klar wird, ob dieser Dienst für jeden Operationstyp dieselbe oder eine neue Instanz wie der Controller erhält. Dieser Dienst macht lediglich seine Abhängigkeiten als Eigenschaften verfügbar, damit sie in der Ansicht angezeigt werden können.Um die Objektlebensdauer innerhalb und zwischen einzelnen Anforderungen an die Anwendung zu demonstrieren, enthält das Beispiel eine
OperationsController
, die jede Art vonIOperation
Typ anfordert, sowie eineOperationService
. DieIndex
Aktion zeigt dann alleOperationId
Werte des Controllers und des Dienstes an .Nun werden zwei separate Anforderungen an diese Controller-Aktion gestellt:
Beobachten Sie, welcher der
OperationId
Werte innerhalb einer Anforderung und zwischen Anforderungen variiert.Vorübergehende Objekte sind immer unterschiedlich. Jeder Steuerung und jedem Dienst wird eine neue Instanz bereitgestellt.
Objekte mit Gültigkeitsbereich sind innerhalb einer Anforderung gleich, unterscheiden sich jedoch in verschiedenen Anforderungen
Singleton-Objekte sind für jedes Objekt und jede Anforderung gleich (unabhängig davon, ob eine Instanz in bereitgestellt wird
ConfigureServices
).quelle
Bei der Abhängigkeitsinjektion von .NET gibt es drei Hauptlebensdauern:
Singleton , das eine einzelne Instanz in der gesamten Anwendung erstellt. Es erstellt die Instanz zum ersten Mal und verwendet dasselbe Objekt in allen Aufrufen erneut.
Gültigkeitsdauer- Services werden einmal pro Anforderung innerhalb des Gültigkeitsbereichs erstellt. Dies entspricht einem Singleton im aktuellen Bereich. In MVC wird beispielsweise eine Instanz für jede HTTP-Anforderung erstellt, in den anderen Aufrufen innerhalb derselben Webanforderung wird jedoch dieselbe Instanz verwendet.
Transient Lifetime Services werden jedes Mal erstellt, wenn sie angefordert werden. Diese Lebensdauer eignet sich am besten für leichte, zustandslose Dienste.
Hier finden Sie Beispiele, um den Unterschied zu sehen:
ASP.NET 5 MVC6-Abhängigkeitsinjektion in 6 Schritten (Webarchivlink aufgrund eines toten Links)
Ihre Abhängigkeitsinjektion bereit ASP.NET: ASP.NET 5
Und das ist der Link zur offiziellen Dokumentation:
Abhängigkeitsinjektion in ASP.NET Core
quelle
Transient, Scoped und Singleton definieren den Objekterstellungsprozess in ASP.NET MVC Core DI, wenn mehrere Objekte desselben Typs injiziert werden müssen. Falls Sie mit der Abhängigkeitsinjektion noch nicht vertraut sind, können Sie dieses DI IoC-Video sehen .
Sie können den folgenden Controller-Code sehen, in dem ich zwei Instanzen von "IDal" im Konstruktor angefordert habe. Transient, Scoped und Singleton definieren, ob dieselbe Instanz in "_dal" und "_dal1" oder anders eingefügt wird.
Transient: In Transient werden neue Objektinstanzen in eine einzelne Anforderung und Antwort eingefügt. Unten ist ein Schnappschuss, in dem ich GUID-Werte angezeigt habe.
Gültigkeitsbereich: Im Gültigkeitsbereich wird dieselbe Objektinstanz in eine einzelne Anforderung und Antwort eingefügt.
Singleton: In Singleton wird dasselbe Objekt über alle Anforderungen und Antworten hinweg injiziert. In diesem Fall wird eine globale Instanz des Objekts erstellt.
Unten finden Sie ein einfaches Diagramm, das die obigen Grundlagen visuell erklärt.
Das obige Bild wurde vom SBSS-Team gezeichnet, als ich an einem ASP.NET MVC-Training in Mumbai teilnahm . Ein großes Dankeschön geht an das SBSS-Team für die Erstellung des obigen Bildes.
quelle
new TService
. Scoped speichert die erste Initialisierung für diesen "Bereich" zwischen (in den meisten Fällen http-Anforderung). Singleton speichert während der gesamten Lebensdauer der Anwendung nur eine Instanz, so einfach ist das. Die obigen Diagramme sind so kompliziert.Normalerweise sollte die Codeanforderung über einen Konstruktorparameter erfolgen, wie in
Ich wollte in der Antwort von @ akazemis darauf hinweisen, dass "Dienste" im Kontext von DI keine RESTful-Dienste bedeuten. Services sind Implementierungen von Abhängigkeiten, die Funktionen bereitstellen.
quelle
AddSingleton ()
AddSingleton () erstellt eine einzelne Instanz des Dienstes, wenn dieser zum ersten Mal angefordert wird, und verwendet dieselbe Instanz an allen Stellen, an denen dieser Dienst benötigt wird.
AddScoped ()
In einem Scoped Service erhalten wir mit jeder HTTP-Anforderung eine neue Instanz. Wenn jedoch innerhalb derselben HTTP-Anforderung der Dienst an mehreren Stellen erforderlich ist, z. B. in der Ansicht und im Controller, wird dieselbe Instanz für den gesamten Umfang dieser HTTP-Anforderung bereitgestellt. Jede neue HTTP-Anforderung erhält jedoch eine neue Instanz des Dienstes.
AddTransient ()
Bei einem vorübergehenden Dienst wird jedes Mal eine neue Instanz bereitgestellt, wenn eine Dienstinstanz angefordert wird, unabhängig davon, ob sie sich im Bereich derselben HTTP-Anforderung oder über verschiedene HTTP-Anforderungen hinweg befindet.
quelle
Nachdem ich nach einer Antwort auf diese Frage gesucht hatte, fand ich eine brillante Erklärung mit einem Beispiel, das ich mit Ihnen teilen möchte.
Sie können sich HIER ein Video ansehen, das die Unterschiede zeigt
In diesem Beispiel haben wir diesen angegebenen Code:
HomeController
Ansicht erstellen
Startup.cs
Copy-Paste diesen Code ein und klicken Sie auf die Schaltfläche Erstellen in der Ansicht und wechseln Sie zwischen
AddSingleton
,AddScoped
undAddTransient
Sie werden jedes Mal ein anderes Ergebnis erhalten , dass Sie diese Erklärung verstehen könnte helfen:quelle
Welches zu verwenden
Vorübergehend
Geltungsbereich
Singleton
Verwenden Sie Singletons, bei denen Sie den anwendungsweiten Status beibehalten müssen. Anwendungskonfiguration oder -parameter, Protokollierungsdienst, Zwischenspeichern von Daten sind einige Beispiele, bei denen Sie Singletons verwenden können.
Injizieren eines Dienstes mit unterschiedlichen Lebensdauern in einen anderen
quelle
Wie hier beschrieben (dieser Link ist sehr nützlich) mit einem Beispiel,
quelle
Registrieren von Diensten
Der ASP.NET-Kern bietet die folgenden drei Methoden zum Registrieren von Diensten im Abhängigkeitsinjektionscontainer. Die von uns verwendete Methode bestimmt die Lebensdauer des registrierten Dienstes.
AddSingleton () - Wie der Name schon sagt, erstellt die AddSingleton () -Methode einen Singleton-Dienst. Ein Singleton-Dienst wird erstellt, wenn er zum ersten Mal angefordert wird. Dieselbe Instanz wird dann von allen nachfolgenden Anforderungen verwendet. Im Allgemeinen wird ein Singleton-Dienst nur einmal pro Anwendung erstellt, und diese einzelne Instanz wird während der gesamten Anwendungslebensdauer verwendet.
AddTransient () - Diese Methode erstellt einen Transient-Dienst. Bei jeder Anforderung wird eine neue Instanz eines Transient-Dienstes erstellt.
AddScoped () - Diese Methode erstellt einen Scoped-Service. Eine neue Instanz eines Bereichsdienstes wird einmal pro Anforderung innerhalb des Bereichs erstellt. In einer Webanwendung wird beispielsweise 1 Instanz pro http-Anforderung erstellt, in den anderen Aufrufen innerhalb derselben Webanforderung wird jedoch dieselbe Instanz verwendet.
quelle