2011-02-11 2 views
1

В последнее время я думал о том, как использовать сообщение для реализации совместной работы с объектом. И теперь у меня есть некоторые мысли:Сотрудничество с доменным доменом на основе сообщений

  1. Каждый объект домена реализует интерфейс, если он хочет ответить на одно сообщение;
  2. Каждый объект домена не будет зависеть от каких-либо других объектов домена, это означает, что у нас не будет отношения Model.OtherModel;
  3. Каждый объект домена выполняет только те вещи, которые только изменяют сами;
  4. Каждый объект домена может отправить сообщение, и это сообщение будет получено любыми другими объектами домена, которые заботятся об этом сообщении;

В общем, единственным способом совместной работы между объектами домена является сообщение, один объект домена может отправлять любые сообщения или получать любые сообщения, если это необходимо.

Когда я узнаю 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. 
    } 
} 

Вот мои мысли. Надеюсь услышать ваши слова.

ответ

Смежные вопросы