Сценарий, написанный на языке C#, три основных проекта в моем решении: Remote, Event и Model.
Удаленный: управление сокетом из удаленной системы. Remote имеет два обработчика: для уведомления о состоянии соединения отправьте сообщение из удаленной системы.
Событие: publi sh сообщения по всему решению
Модель: businnes logi c.
Я хочу, чтобы Remote был изолирован от остальной системы, я имею в виду создание менеджера в Model, который перехватывает уведомления от Remote и использует Event для распространения сообщения. Я хочу, чтобы все остальные менеджеры в модели знали только Модель, но не Удаленную реализацию сообщения.
Я уже сделал пользовательские сообщения для публикации sh Событием состояния соединения из Удаленного, моя проблема заключается в следующем: Как я могу отправить сообщение без того, чтобы кто-то перехватил сообщение, знает о реализации? Каждое сообщение имеет разные свойства.
Я пытался создать сообщение в модели, которая имеет такой же интерфейс сообщения в удаленном режиме.
Но в этом случае каждый может зарегистрироваться в режиме, чтобы получить сообщение, должен знать реализацию сообщения для получения свойств.
Сообщение, которое отправляется вокруг модели по событию
MessageEvent: IEvent
public const string Name="MessageEvent"
// The message implemented in Remote
public IRemoteMessage RemoteMessage {get; private set;}
public void MessageEvent(IRemoteMessage rm)
{
// I want to avoid make a copy of the original message, too much classes to have same information
RemoteMessage = rm;
}
Обработчики с Remote в CommunicationManager в модели
RemoteService.ReceivedData += OnReceiveData;
OnReceiveData(object sender, DataArgs e)
{
var remoteMessage = e as IRemoteMessage;
EventService.Publish(new MessageEvent(remoteMessage))
}
Каждый может зарегистрировать событие (наблюдатель) в модели как:
EventService.Register(OnManageData, MessageEvent.Name)
\\..
private void OnManageData(EvtData arg)
{
if (arg is MessageEvent)
{
var me = arg as MessageEvent;
// I have the problem here, I can cast remoteMessage by its impementation in Remote to get the properties but I don't want it!!!
var remoteMessage = me.RemoteMessage;
}
}
Все работает в моем реальном сценарии, но Я повторяю себя:
- Remote не должен ссылаться на модель или событие
- Модель должна передавать CommunicationManager сообщение от Remote всем остальным менеджерам в модели
- Никто не должен знать о реализации удаленного сообщения
Все предложения будут оценены