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:
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.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í:
ProjectA tiene aplicación a IManager.
Siempre que hay una cahnge en la transmisión utilizo StructureMap recibir instancia de aplicación IManager y luego llamar
OnTransmissionChanged();
É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?
¿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
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
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 ... –