2014-03-25 3 views
6

Die Beispiele, die ich in der Unity-Dokumentation gesehen haben müssen Sie, indem new LifetimeManager() inline die Lebensdauer Manager angeben. Also ich habe diesen Code:Teilen lebenslange Manager zwischen Typen in Unity?

container.RegisterType<ApplicationDbContext>(new PerRequestLifetimeManager()); 

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new PerRequestLifetimeManager(), 
      new InjectionConstructor(typeof (ApplicationDbContext))); 

container.RegisterType<UserManager<ApplicationUser>>(new PerRequestLifetimeManager()); 

Gut, aber ich frage mich, warum ich so viele Instanzen erstellen. Gibt es einen Grund warum ich es nicht so schreiben sollte?

var lifetimeManager = new PerRequestLifetimeManager(); 

container.RegisterType<ApplicationDbContext>(lifetimeManager); 

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(lifetimeManager, 
      new InjectionConstructor(typeof (ApplicationDbContext))); 

container.RegisterType<UserManager<ApplicationUser>>(lifetimeManager); 

Es scheint offensichtlich, aber kommentarlos alle Beispiele sind in dem ehemaligen Stil durch die PDF zu lesen, so frage ich mich, ob ich nicht etwas über das Verständnis bin, wie es funktioniert.

Antwort

4

Nein, können Sie dies nicht tun. Sie werden feststellen, dass Ihre Anwendung eine Ausnahme auslöst, wenn Sie versuchen:

Die Lebensdauer Manager bereits registriert ist. Lifetime Manager können nicht wiederverwendet werden, bitte erstellen Sie einen neuen.

Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.

Ausnahmedetails: System.InvalidOperationException: Die Lebensdauer Manager ist bereits registriert. Lifetime Manager können nicht wiederverwendet werden, bitte erstellen Sie einen neuen.

1

IIRC, eine Einheit der Lebensdauer ist einfach eine Klasse, die von der abstrakten LifetimeManager-Klasse abgeleitet wird, und Sie können Objekte wiederverwenden.

In my book, in Kapitel 14 zeige ich ein komplexes Beispiel eine benutzerdefinierte Lebensdauer Manager für die Einheit des Gebäudes, und registrieren sie schließlich wie folgt aus:

var lease = new SlidingLease(TimeSpan.FromMinutes(1)); 
var cache = new CacheLifetimeManager(lease); 
container.RegisterType<IIngredient, Parsley>(cache); 

Es sei denn, Architektur Unity Lebensdauer-Management hat sich deutlich verändert, seit ich sah Ich sehe keinen Grund, bei jeder Registrierung eine neue PerRequestLifetimeManager Instanz zu erstellen.

+1

Great! Danke vielmals. Ich fand das Lesen Ihres Buches enorm hilfreich bei der Auswahl eines DI-Containers, also nehme ich an, ich hätte es nochmal anschauen sollen. :) – Casey

+2

Nun, so viel wie ich hasse einen akzeptierten Antwort-Tag zu widerrufen, nachdem ich es gemacht, dies führt tatsächlich sofort in Ausnahmefällen, wenn ich versuche, es zu laufen: „Die Lebensdauer Manager bereits registriert sind Lifetime-Manager können nicht wiederverwendet werden, bitte. erschaffe eine neue. " – Casey

+1

Fair genug :) Das ist ziemlich schlechtes Design, aber nicht deine Schuld! –