2010-01-13 29 views
5

¿Cómo puedo inyectar (adjuntar) manejadores de eventos a eventos .net de instancias creadas por el contenedor IoC Unity?Cómo inyectar manejadores de eventos en eventos con Unity

Ejemplo: Tengo una clase que informa de errores a través de un evento de .NET estándar:

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

tengo otra clase que es el responsable de los gastos de envío esos eventos:

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

lo que me gustaría hacer es inyectar automáticamente el controlador de CrashMonitor a cada instancia de un CameraObserver como en este pseudocódigo:

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 

¿Hay alguna manera de hacer esto con Unity? Puedo pensar en una solución fea como derivar de CameraObserver con un intendente de constructor especial para la inyección de dependencia o una inyección de método. Pero eso haría que el sistema sea más complejo (porque tienes que escribir código). Ingenuamente esperaría que pudieras agregar un atributo [Dependencia] en el evento y todo debería funcionar.

Respuesta

3

he hecho la misma pregunta en el grupo de discusión unidad en CodePlex

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

y la respuesta es "no hay nada". Hay una demostración de un EventBroker, pero lo que hace es más complejo (autovinculación de editores y suscriptores). Sigo pensando que un mecanismo KISS para inyectar eventos es útil y comencé a hacerlo solo.

+0

Hola, Christian, ¿alguna vez descubriste algo más al respecto o te quedaste con tu diseño personalizado original? Intento usar Unity con un diseño MVVM "puro", que originalmente tenía un CloseCommand heredado de un ViewModel base, donde pasé un delegado a un EventHandler personalizado. Funcionó muy bien hasta que traté de usar Unity para inyectar todo, y luego se rompió rápidamente. Si tiene una solución que me puede hacer bien, agradecería algo de sabiduría. ¡Gracias! –

Cuestiones relacionadas