Unity: Ändern Sie den Standard Lifetime Manager für implizite Registrierungen und / oder deaktivieren Sie sie

8

Der Unity-Container löst automatisch jeden Typ auf, den er selbst herausfinden kann, ohne dass eine manuelle Registrierung erforderlich ist. Das ist in gewisser Hinsicht gut, aber das Problem, das ich habe, ist, dass es ein TransientLifetimeManager für diese Art von Auflösung verwendet, während ich fast immer ein ContainerControlledLifetimeManager möchte. Ich kann meine Typen natürlich immer noch manuell als Singletons registrieren, aber wenn ich es vergesse, anstatt eine unbehandelte Ausnahme beim Start zu bekommen, wird die App erfolgreich gestartet und alles scheint zu funktionieren. Aber es wird irgendwann Fehler geben, möglicherweise sehr subtile, schwer zu diagnostizieren, aufgrund der Tatsache, dass es mehrere Instanzen eines Typs gibt, der ein Singleton sein soll.

Meine Frage ist also: Gibt es eine Möglichkeit, entweder einen anderen Standard-Lifetime-Manager anzugeben oder das Standard-Auto-Resolution-Verhalten vollständig zu deaktivieren und den Container auf Typen zu beschränken, die ich selbst registriere (direkt oder nach meinen eigenen Konventionen)? p>     

dlf 15.07.2015, 02:42
quelle

2 Antworten

5
  

Gibt es eine Möglichkeit, einen anderen Standard Lifetime Manager anzugeben?

Ja, Sie können eine Containererweiterung verwenden, die einen anderen Lifetime Manager verwendet. Ein Beispiel dafür finden Sie unter Anfrage für konfigurierbaren Standard Lifetimemanager .

  

oder deaktivieren Sie das automatische Standardauflösungsverhalten vollständig und begrenzen Sie den Container auf Typen, die ich selbst registriere

Ja, eine Container-Erweiterung kann dies auch tun.

Notieren Sie zuerst während der expliziten Registrierung den BuildKey der Registrierung. Überprüfen Sie dann vor dem Erstellen des Objekts, ob der BuildKey explizit registriert wurde.

%Vor%

Fügen Sie dann die Erweiterung hinzu, registrieren Sie einige Klassen und lösen Sie sie auf. Wenn die Klasse nicht explizit registriert wurde, wird eine Ausnahme ausgelöst.

%Vor%     
Randy Levy 15.07.2015, 04:11
quelle
1

Ich habe versucht, die DefaultLifetimeManagerExtension, aber irgendwie hat es nicht funktioniert. (Vielleicht hat sich die Einheit geändert?). Wenn Sie keine Erweiterung verwenden möchten, können Sie auch die Funktion RegsiterByConvention verwenden.

%Vor%

Dadurch werden alle Klassen mit dem "DisposingTransientLifetimeManager" registriert, den ich als Standard verwendet habe. Beachten Sie, dass Sie dies zu Beginn Ihrer Registrierung tun sollten, da alle Registrierungen frühere Registrierungen desselben Typs und Namens überschreiben werden.

    
D4rth B4n3 05.10.2016 13:48
quelle