2010-01-13 10 views
5

Wie kann ich Ereignishandler in .NET-Ereignisse von Instanzen einfügen, die durch den IoC-Container Unity erstellt wurden?Wie Ereignishandler in Ereignisse mit Unity injiziert werden

Beispiel: Ich habe eine Klasse, die Fehler über ein Standard-.net-Ereignis meldet:

class CameraObserver 
{ 
    public event Action<Exception> UnhandledException;  
    [...] 
} 

Ich habe eine andere Klasse, die für den Umgang mit diesen Ereignissen reponsible ist:

class CrashMonitor 
{ 
    public static void HandleException(Exception x) 
    { ... } 
} 

Was ich möchte, zu tun ist, den Handler von CrashMonitor automatisch zu jeder Instanz eines CameraObserver wie in diesem Pseudocode zu injizieren:

UnityContainer container = new UnityContainer(); 
container.RegisterInstance<Action<Exception>>(CrashMonitor.HandleException) 
    .RegisterType<CameraObserver>(new InjectionEvent(UnhandledException)); 

var observer = container.Resolve<CameraObserver>(); 
// CrashMonitor.HandleException is now attached to observer.UnhandledException 

Gibt es eine Möglichkeit, dies mit Unity zu tun? Ich kann mir eine hässliche Problemumgehung vorstellen, wie die Ableitung von CameraObserver mit einem speziellen Konstruktor, der für die Abhängigkeitsinjektion oder eine Methodeninjektion gedacht ist. Aber das würde das System komplexer machen (weil Sie Code schreiben müssen). Ich würde naiv erwarten, dass Sie ein [Dependency] -Attribut für das Ereignis hinzufügen könnten und alles funktioniert.

Antwort

3

Ich habe die gleiche Frage in der Einheit Diskussionsgruppe gebeten, auf Codeplex

http://unity.codeplex.com/Thread/View.aspx?ThreadId=80728

und die Antwort lautet: „Es ist nichts“. Es gibt eine Demo eines EventBroker, aber was es tut, ist komplexer (Autowiring von Publishern und Abonnenten). Ich denke immer noch, dass ein KISS-Mechanismus, um Ereignisse zu injizieren, nützlich ist und begann, es selbst zu tun.

+0

Hey, Christian, hast du jemals etwas mehr darüber herausgefunden, oder hast du bei deinem ursprünglichen Custom Design geblieben? Ich versuche, Unity mit einem "reinen" MVVM-Design zu verwenden, das ursprünglich einen CloseCommand hatte, der von einem Basis-ViewModel geerbt wurde, wo ich einen Delegaten in einen benutzerdefinierten EventHandler übergab. Arbeitete großartig, bis ich versuchte, mit Unity alles zu injizieren, und dann brach es prompt. Wenn Sie eine Lösung haben, die mir gut tun könnte, würde ich einige Weisheit sehr schätzen. Vielen Dank! –

Verwandte Themen