2016-11-28 9 views
0

Ich frage mich, wie Sie den netcore-Abhängigkeitscontainer für mvc mit einer Instanz pro Benutzer einrichten.Netcore-Abhängigkeitsinjektion pro Benutzer

Nach https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection#service-lifetimes-and-registration-options gibt es derzeit nur drei Methoden, ein Leben lang festgelegt wird: Singleton (eine Instanz pro Anwendung), scoped (eine Instanz innerhalb eines gemeinsamen Httprequest), vorübergehende (eine Instanz pro DI Instanz Anfrage)

Hat hat jemand versucht, eine Instanz pro Benutzer zu erstellen? Ich wäre gespannt, wie es gemacht wird - wenn nicht, werde ich wahrscheinlich irgendwann die Dokumente durchforsten, um zu sehen, wie es gemacht werden kann und die Lösung teilen.

+0

Sie machen eine Instanz pro Anfrage (und nicht pro Benutzer). Die Instanz ist während der gesamten Lebensdauer der Anfrage verfügbar. Können Sie näher erläutern, wie Sie die Instanz verwenden möchten? – alltej

+0

Im Wesentlichen habe ich einen Login-Controller, wo ich die Anmeldeinformationen einer Rest-API eingeben. Diese übrigen Client-Instanzen werden mit den Anmeldeinformationen initialisiert, die bei der Anmeldung übergeben werden. Daher würde mein Plan sein, das Fabrikregister für die Instanz zu verwenden, indem ich die Login-Informationen, die ich innerhalb der Claims-Identität speichere, einmal pro Benutzer speichere. Während dies bereits auf einer Pro-Umfang/pro Anfrage-Basis funktioniert, ist es suboptimal in Bezug auf die Leistung. – Dbl

+0

(1) Speicher-Caching mit Timeout; (2) Singleton-Wörterbuch mit einigen Token als Schlüssel (Sitzungs-ID?) - Sie benötigen manuelle Bereinigung; (3) [CookieTempData] (https://luisfsgoncalves.wordpress.com/2016/07/29/cookie-based-tempdata-for-asp-net-core/) – Dmitry

Antwort

1

Erstellen Sie Instanz auf erste Benutzeranforderung und halten Sie sie am Leben (für nächste Anfragen), bis mit etwas Ablauf Timeout ... Dies sieht aus wie ein Sessions.

Sie können Ihren Service mit Factory-Methode registrieren und aktuelle Session im Inneren analysieren.

+0

während das würde sicherlich funktionieren, ich will nicht mit der Abhängigkeitsinjektion verbundene Dienste in die Sitzung einlagern. Ich werde es jedoch im Hinterkopf behalten. – Dbl

+0

Seien Sie ehrlich zu sich selbst - Sie suchen etwas, um DI und Sitzungen zu mischen. Egal wie du es nennst - es ist wahr. Es ist benutzerdefiniert. Sie können es auf verschiedene Arten implementieren - sagen Sie, erstellen Sie Ihren eigenen "Scope" (in Bezug auf DI) und setzen Sie es in Sitzung und lösen Sie andere Dienste aus diesem Bereich, aber verwenden Sie immer noch "einige Sitzung" -Mechanismus, die Speicher pro Benutzer verwenden funktioniert nicht in Webfarmen (Sie können den Service nicht serialisieren und für mehrere Prozesse/Maschinen freigeben) und so weiter. Wenn Sie das nicht mögen (es ist schlecht für die Skalierung) - könnten Sie Ihre Architektur überprüfen/überdenken? – Dmitry

+0

Während ich teilweise mit Ihnen einverstanden bin, möchte ich es immer noch nicht mischen. Eine Unterbrechung nach einer Deaktivierungssitzung wäre eine unerwartete Nachwirkung, bei der tatsächlich alle meine DI von einer eindeutigen Anforderungsidentität abhängig sein sollten. – Dbl

Verwandte Themen