У меня сейчас проблема с реализацией решения для межобъектной коммуникации в моем текущем проекте. Я решил опробовать такой объект, как шаблон посредника, где объекты общаются друг с другом с помощью сообщений через широковещательную передачу посреднику. Затем посредник отправляет сообщение объектам, которые специально прослушивали передаваемое сообщение.
Предыдущие объекты-посредники, которые я использовал, полагались на удержание контейнеров обработчиками, обрабатывающими только базовое сообщение, что вынуждает слушателей преобразовывать сообщения перед этим. они могли бы справиться с ними. Я думал, что смогу справиться с этим, имея коллекции самих обработчиков в наборе ключей согласно некоторому произвольному типу. Делая это, я надеюсь избежать любого вида кастинга, который слушатель должен сделать, чтобы ответить на сообщение.
Проблема в том, что я не могу понять, как получить объект, который позволяет другим регистрироваться для строго типизированного сообщения, чтобы поддерживать единую коллекцию различных типов обработчиков строго типизированных сообщений.
В идеале, я бы хотел, чтобы интерфейс publi c выглядел следующим образом:
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));
}
}
Возможно ли в этом проекте использовать обработку сообщений со строгой типизацией, которую я хотеть? Если да, то как мне это сделать?
Изменить - добавлен код, описывающий, как я хочу, чтобы объект отправителя и получателя взаимодействовал с методами.