В последнее время я думал о том, как использовать сообщение для реализации совместной работы с объектами домена.И теперь у меня есть некоторые мысли:
- Каждый объект домена реализует интерфейс, если он хочет ответить на одно сообщение;
- Каждый объект домена не будет зависеть от каких-либо других объектов домена, чтоозначает, что у нас не будет отношения Model.OtherModel;
- Каждый объект домена выполняет только те действия, которые изменяются только сам;
- Каждый объект домена может отправлять сообщение, и это сообщение будет полученолюбые другие доменные объекты, которые заботятся об этом сообщении;
В целом, единственный способ сотрудничества между объектами домена - это сообщение, один объект домена может отправлять любые сообщения или получать любые сообщения столько, сколько ему нужно.
Когда я изучаю DDD Эванса, я вижу, что он определяет концепцию агрегирования в домене, я думаю, что агрегат статичен и не подходит для взаимодействия объектов, он сосредоточен только на статической структуре объектов или отношениях между объектами.В реальном мире объект будет взаимодействовать с использованием сообщений, а не путем ссылки на друг друга или объединения других объектов.На мой взгляд, все объекты равны, то есть они не будут зависеть от других объектов.О том, как реализовать функциональность отправки сообщений или получения сообщений, я думаю, что мы можем создать инфраструктуру EventBus, которая специально используется для совместной работы объекта домена.Мы можем сопоставить тип события с типом подписчика в словаре.Ключ - тип события, значение - список типов подписчиков.Когда возникает одно событие, мы можем найти соответствующие типы подписчиков и получить все объекты домена подписчика из постоянства данных, а затем вызвать соответствующие методы-обработчики для каждого подписчика.
Например:
public class EventA : IEvent { }
public class EventB : IEvent { }
public class EventC : IEvent { }
public class ExampleDomainObject : Entity<Guid>{
public void MethodToRaiseAnExampleEvent()
{
RaiseEvent(new EventC());
}
}
public class A : Entity<Guid>, IEventHandler<EventB>, IEventHandler<EventC> {
public void Handle(EventB evnt)
{
//Response for EventB.
}
public void Handle(EventC evnt)
{
//Response for EventC.
}
}
public class B : IEventHandler<EventA>, IEventHandler<EventC> {
public void Handle(EventA evnt)
{
//Response for EventA.
}
public void Handle(EventC evnt)
{
//Response for EventC.
}
}
Это мои мысли.Надеется услышать ваши слова.