В настоящее время у меня возникла проблема с реализацией решения для межобъектного взаимодействия в моем текущем проекте. Я решил опробовать такой объект, как шаблон посредника, где объекты общаются друг с другом с помощью сообщений через широковещательную рассылку посреднику. Затем посредник отправляет сообщение объектам, которые специально прослушали транслируемое сообщение.
Предыдущие объекты-посредники, которые я использовал, основывались на хранении контейнеров для обработчиков, обрабатывающих только базовое сообщение, вынуждая слушателей передавать сообщения, прежде чем они смогут их обработать. Я думал, что смогу обойтись с этим, имея коллекции самих обработчиков в коллекции с ключами в соответствии с каким-то произвольным типом. Поступая так, я надеюсь избежать какого-либо преобразования, которое должен выполнить слушатель, чтобы ответить на сообщение.
Проблема в том, что я не могу понять, как получить объект, который позволяет другим регистрироваться для строго типизированного сообщения, чтобы поддерживать единую коллекцию различных типов строго типизированных обработчиков сообщений.
В идеале я бы хотел, чтобы общедоступный интерфейс выглядел следующим образом:
class Mediator
{
private Dictionary<Type, ???> handlers; // how to I retain the strongly-typed handler
public void RegisterForBroadcast<T>(Action<T> handler) where T : IMessage
{
// how can I turn the strongly-typed handler into something I can use?
}
public void UnregisterFromBroadcast<T>(Action<T> handler) where T : IMessage
{
}
public void Broadcast<T>(T message) where T : IMessage
{
// how do I get the collection of handlers from where it's stored and use it?
}
}
class Receiver
{
private Mediator mediator;
public Receiver()
{
mediator = GetMediator();
mediator.RegisterForBroadcast<SpecificMessage>(MessageHandler);
}
private void MessageHandler(SpecificMessage msg)
{
CustomData data = msg.GetCustomData();
}
}
class BroadcastingObject
{
private Mediator mediator;
private SpecificData data;
public BroadcastingObject()
{
mediator = GetMediator();
specificData = GetSpecificData();
}
public void TimeToBroadcast()
{
mediator.Broadcast<SpecificMessage>(new SpecificMessage(specificData));
}
}
Возможно ли с этим дизайном иметь строго типизированную обработку сообщений, которую я хочу? Если да, то как мне это сделать?
Изменить - добавлен код, описывающий, как объект отправителя и получателя должен взаимодействовать с методами.