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.
'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
Wirklich? Was ist das Beste für .net-Anwendungen? Ich muss auch übergreifende Sorge umsetzen. Autofac? –