В последнее время я думал о том, как использовать сообщение для реализации совместной работы с объектом. И теперь у меня есть некоторые мысли:Сотрудничество с доменным доменом на основе сообщений
- Каждый объект домена реализует интерфейс, если он хочет ответить на одно сообщение;
- Каждый объект домена не будет зависеть от каких-либо других объектов домена, это означает, что у нас не будет отношения Model.OtherModel;
- Каждый объект домена выполняет только те вещи, которые только изменяют сами;
- Каждый объект домена может отправить сообщение, и это сообщение будет получено любыми другими объектами домена, которые заботятся об этом сообщении;
В общем, единственным способом совместной работы между объектами домена является сообщение, один объект домена может отправлять любые сообщения или получать любые сообщения, если это необходимо.
Когда я узнаю DDD от Evans, я вижу, что он определяет совокупную концепцию в домене, я думаю, что совокупность является статической и не подходит для взаимодействия объектов, он ориентируется только на статическую структуру объектов или взаимосвязь между объектами. В реальном мире объект будет взаимодействовать с использованием сообщений, а не путем ссылки друг на друга или объединения других объектов. На мой взгляд, все объекты равны, что означает, что они не будут зависеть от каких-либо других объектов. Что касается реализации функций отправки сообщений или получения сообщений, я думаю, что мы можем создать фреймворк 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.
}
}
Вот мои мысли. Надеюсь услышать ваши слова.