Tengo clases que necesitan comunicarse entre sí. El problema es que si uno hace que el otro contenga el otro (una relación entre padres e hijos), entonces las cosas se vuelven complicadas. O bien debe pasar una instancia del padre al hijo, (entonces, ¿cuál creará primero si está usando la inyección de dependencia) o puede usar delegados/eventos? Pero quiero hacer cumplir el hecho de que el padre debe ser capaz de manejar el evento que el niño plantea. No estoy muy seguro de cómo hacer eso. Tampoco quiero múltiples suscriptores al evento.¿Cuál es el mejor patrón para la comunicación bidireccional entre clases?
La relación padre-hijo simplemente se siente mal para la comunicación bidireccional. Desafortunadamente no es un caso que uno de los objetos siempre inicie y el otro responda. Cualquiera puede iniciar y el otro debe responder.
¿Hay algún otro patrón que me falta?
ACTUALIZACIÓN: Lo siento, esto es bastante difícil de explicar. Olvidé agregar que cuando una clase envía un mensaje a otra clase, no espera la respuesta de inmediato. La respuesta viene de forma asíncrona, por lo que necesita una instancia del padre para llamar al método correcto o un delegado/evento. Lo siento, el siguiente ejemplo es pseudo código. Con suerte, es suficiente para tener la idea. Debería mirar el patrón del mediador.
public class Foo
{
public void SendMessageAToBar()
{
MessageA msg = new MessageA();
Bar.ReceiveMessageAFromFoo(msg);
}
public void ReceiveMessageARespFromBar(MessageAResp msgResp)
{
//Got a response do something
}
public void ReceiveMessageBFromBar(MessageB msg)
{
//Do something msg
MessageBResp msgBResp = new MessageBResp();
Bar.ReceiveMessageBRespFromFoo()
}
}
public class Bar
{
public void ReceiveMessageAFromFoo(MessageA msg)
{
//DO something.
MessageAResp resp = new MessageAResp();
Foo.ReceiveMessageARespFromBar(resp);
}
public void SendMessageBToFoo()
{
MessageB msg = new MessageB();
Foo.ReceiveMessageBFromBar(msg);
}
public void ReceiveMessageBRespFromFoo(MessageBResp msgResp)
{
//Got a response do something
}
}
¿Qué tiene de diferente el niño, lo que significa que no quiere usar eventos aquí? –
¿Puedes agregar ejemplos de código de un niño y un padre? – jgauffin
Quizás te ayude si describes a qué objetos reales te refieres como padres e hijos. No siempre es malo si el niño tiene un ref como padre. Hay muchos casos como TreeView, XmlNode, etc. y también el uso de un Observer es una opción muy viable también. No estoy seguro de por qué está diciendo "Tampoco quiero múltiples suscriptores al evento". ¿Podrías explicar eso también? –