2011-08-09 9 views
5

Tengo dos proyectos. ProjectA tiene una clase llamada Task y projectB tiene una clase llamada Transmission. Me gustaría que cada vez que se cambie la transmisión, algo suceda en Tarea y siempre que se cambie la tarea, algo suceda en Transmisión.interactuando entre proyectos

Para eso he creado otro proyecto llamado Common, donde tanto ProjectA como projectB tendrán referencia. En común, pongo todas las interfaces para interactuar entre ambas entidades.

En el proyecto Común, creé una interfaz llamada IManager que ProjectA implementará. El rol del Gerente es manejar las actualizaciones. El aspecto interfaz como esto:

public interface IManager 
{ 
    ITaskChangedHandler TaskChangedHandler { set; } 

    void OnTransmissionChanged(ITransmissionWithTasks transmission); 
} 

Esta interfaz tiene 2 métodos ProjectA tiene que implementar:

  1. void OnTransmissionChanged(ITransmissionWithTasks transmission); Cuando hay un cambio en la transmisión (en el interior ProjectB) este método se llama con el fin de hacer una actualización en las tareas.

  2. ITaskChangedHandler TaskChangedHandler { set; } La implementación de IManager tiene que establecerse en ITaskChangedHandler. ITaskChangedHandler es una interfaz que define un método para la transmisión de actualización en caso de tarea se cambia:

    public interface ITaskChangedHandler 
    { 
        void OnTaskChanged(string moduleName, ITask task, long transmissionId); 
    } 
    

Ahora, que dice así:

  1. ProjectA tiene aplicación a IManager.

  2. Siempre que hay una cahnge en la transmisión utilizo StructureMap recibir instancia de aplicación IManager y luego llamar OnTransmissionChanged();

  3. Ésta es mi problema - Cada vez que hay un cambio en la Tarea (en ProjectA) Me gustaría llame a la implementación de IManager al TaskChangedHandler.OnTaskChanged(). Pero el problema es que la instancia de implementación de IManager no configura el TaskChangedHandler.
    Asimismo, no sé dónde he de poner esto TaskChangedHandler:

    • Esto no puede estar en ProjectA porque no conocen la implementación de ITaskChangedHandler.

    • Esto no puede estar en ProjectB porque la creación de la implementación de IManager ocurre en ProjectA, por lo que el conjunto debe estar en projectA.

    • Esto no puede ser un proyecto común porque no conoce las implementaciones de IManager y ITaskChangedHandler.

Puede alguien ayudarme a solucionar este asunto?

Respuesta

2

Aquí hay un método rápido y sucio que podría hacerle pensar: una clase estática, compartida, que puede definir en su conjunto compartido.

public static class SharedEvents 
{ 
    public delegate void FirstEventHandler(); 
    public delegate void SecondEventHandler(); 

    public static event FirstEventHandler FirstEvent; 
    public static event FirstEventHandler SecondEvent; 

    public static void OnFirstEvent() 
    { 
     if (FirstEvent != null) FirstEvent(); 
    } 

    public static void OnSecondEvent() 
    { 
     if (!SecondEvent != null) SecondEvent(); 
    } 
} 

Una registros para manejar la FirstEvent, otro para manejar el SecondEvent: a llamar a los demás, llame OnFirstEvent() o OnSecondEvent() en consecuencia.

Este es un simple y bastante pobre, la implementación del patrón Mediador:

http://en.wikipedia.org/wiki/Mediator_pattern

Con la inyección de dependencias, se puede obtener una instancia de un objeto basado en una interfaz compartida, también. Por ejemplo, con Ninject, puede registrar un controlador para IFirst como una constante (instancia específica de algo que implementa IFirst) y viceversa. Luego llame al Get<IFirst> para agarrarlo.

+1

¿Qué crees que es mejor, usar un mediador estático (o no estático) o usar ambas formas con la inyección de dependencia? – Naor

+0

Después de pensarlo dos veces, este mediador tiene que ser estático. Cada proyecto debe registrar los eventos y, si no es estático, no habrá ninguna instancia para registrarse. ¿Estoy en lo cierto? – Naor

+1

Nada tiene que ser estático si usa un singleton a través de la inyección de dependencia, puede simplemente 'Obtener ' (por ejemplo) y recuperar la misma instancia. La estática es bastante fea en mi opinión. El mediador debería registrarse antes de usarlo. Dicho esto, no necesitaría un mediador que use DI, porque la tarea podría registrarse como la implementación de ITask, la transmisión como ITransmisión y ambas podrían tener acceso mediante DI ... –

Cuestiones relacionadas