2010-01-13 5 views
5

Comment injecter (attacher) des gestionnaires d'événements aux événements .net d'instances créés par le conteneur Unity IoC?Comment injecter des gestionnaires d'événements dans des événements avec Unity

Exemple: J'ai une classe qui signale les erreurs par un événement standard .net:

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

J'ai une autre classe qui est reponsible pour gérer ces événements:

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

Ce que je voudrais à faire est d'injecter automatiquement le gestionnaire de CrashMonitor à tous les cas d'un CameraObserver comme dans ce pseudo-code:

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 

Existe-t-il un moyen de faire cela avec Unity? Je peux penser à une solution de contournement laide comme dérivant de CameraObserver avec un constructeur spécial intendend pour l'injection de dépendance ou une injection de méthode. Mais cela rendrait le système plus complexe (parce que vous devez écrire du code). Je m'attendais naïvement que vous pourriez ajouter un attribut [Dependency] sur l'événement et tout devrait fonctionner.

Répondre

3

J'ai posé la même question dans le groupe de discussion de l'unité sur CodePlex

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

et la réponse est « il n'y a rien ». Il y a une démo d'un EventBroker mais ce qu'il fait est plus complexe (autowiring des éditeurs et des abonnés). Je pense toujours qu'un mécanisme KISS pour injecter des événements est utile et a commencé à le faire par moi-même.

+0

Hey, Christian, avez-vous déjà trouvé quelque chose de plus à ce sujet, ou avez-vous conservé votre design personnalisé original? J'essaie d'utiliser Unity avec un design MVVM "pur", qui avait à l'origine un CloseCommand hérité d'un ViewModel de base, où j'ai passé un délégué dans un EventHandler personnalisé. J'ai travaillé très bien jusqu'à ce que j'essaie d'utiliser Unity pour tout injecter, et ensuite il s'est brisé rapidement. Si vous avez une solution qui pourrait me faire du bien, j'apprécierais beaucoup de sagesse. Merci! –

Questions connexes