0

Ich habe eine einfache Frage. Ich bin neuer mit UnityContainer von Miscrosoft. Ich schreibe eine ASP.NET MVC-Anwendung mit Unity für DI. Habe ich einen anderen CONTAINER für jeden Benutzer, der mit meiner Web App verbunden ist? Oder ist der CONTAINER für alle Benutzer gleich? Also, wenn ich die Lebensdauer eines Objekts mit ContainerControlledLifetimeManager auflösen bedeutet dies, dass nur für eine Benutzersitzung dieses Objekt immer gleich ist?Einheit Container in ASP.NET MVC

Ich hoffe, Sie verstehen.

Danke, Christian

+0

'Ich schreibe eine ASP.NET MVC-Anwendung mit Unity for DI. - Beachten Sie, dass das Unity-Projekt tot ist. Für neue Anwendungen wäre es am besten, einen der [vielen anderen Container] (https://github.com/danielpalme/IocPerformance) zu verwenden, die noch aktiv sind. – NightOwl888

+0

Wirklich? Was ist das Beste für .net-Anwendungen? Ich muss auch übergreifende Sorge umsetzen. Autofac? –

Antwort

1

Lebenszeit bezieht sich auf die Lebensdauer des Objekts durch die DI-Prozess erstellt. Pro Anfrage bedeutet, dass jede Anfrage ein eigenes Objekt bekommt. Wenn das Objekt vom aktuellen Benutzer, den Querystring-Werten für diese Anfrage oder den Werten/Vorhandensein von Request-Headern abhängt, ist eine PerRequest-Lebensdauer angemessen. Wenn Sie beispielsweise Einstellungen haben, die je nach Standort Ihres Dienstes variieren, indem Sie Werte aus web.config gespeichert haben, wird der Container höchstwahrscheinlich in global.asa erstellt, und diese Objekte können so lange bestehen, wie der Container lebt.

Ein konkretes Beispiel:

Sie haben einen Dienst als Teil Ihrer Website und Sie migrieren zu vNext dieses Dienstes. Benutzer können sich anmelden, indem sie auf einen Link klicken, der einen Parameter wie &myService=vNext enthält, um das neue Verhalten zu sehen. Ihre Factory-Methode verwendet den Wert dieses Parameters, um vNow oder vNext für jede Anforderung auszuwählen.

Hier einig Pseudo-Code zum Einstieg:

container.RegisterInstance<IProductFactory>("enterprise", new EnterpriseProductFactory()); 
container.RegisterInstance<IProductFactory>("retail", new RetailProductFactory()); 
container.RegisterVersionedServiceFactory<IProductFactorySettings, IProductFactory>(); 

In diesem Beispiel RegisterVersionedServiceFactory ist eine Erweiterung Methode, die nichts tut, sondern was der IProductFactory Instanzen entscheiden, für die aktuelle Anforderung zu verwenden. Die Factory stellt die aktuelle Instanz (es gibt nur zwei für die Lebensdauer des Dienstes) für diese Anforderung zur Verfügung (Tausende pro Sekunde).

Dieses Muster ist, was eine sehr große Website macht, die Sie wahrscheinlich in letzter Zeit beide sehr stabil und sehr flexibel verwendet haben. Neue Versionen von Diensten werden unter Verwendung dieses exakt gleichen Musters bereitgestellt, um die Site sehr stabil zu halten.

+0

Ich meine, wenn ich mit ContainerControlledLifetimeManager ein Objekt für die Verbindung zur Datenbank auflösen, ist dieses Objekt das gleiche für alle Clients, die mit meiner wep App verbunden sind? –

+0

Die Antwort hängt davon ab. Ich denke, im Allgemeinen ist es wünschenswert, Verbindungen zu teilen, damit Ihre Datenbank besser funktioniert. total unterschiedliche Konversation. Ich müsste tiefer in unseren Code eintauchen, als ich gesehen habe, aber mein Rat ist, einfach die verschiedenen Registrierungsarten auszuprobieren. Erstellen Sie ein Objekt, das eine Verwendungszählung hat, registrieren Sie es auf mehrere Arten und fragen Sie jedes Objekt, dessen Nutzungsanzahl Sie zurückerhalten. Wenn es immer eins ist, dann haben Sie eine Fabrik, die eine pro Anfrage erstellt. Wenn es bei jeder Referenz zunimmt, ist es ein Singleton. Wenn die Anzahl unerwarteter Aufrufe nach einer Erhöhung auf 1 zurückkehrt, liegt ein Fehler vor. –

Verwandte Themen