2015-12-09 6 views
2

Я пытаюсь реализовать домен Driven Design (DDD) в то время как в то же самое время, используя принципы SOLID конструкции имеют следующий вопрос:Делегирование домена модели поведения за пределами Entity

Если мои объекты домена содержат только состояние и поведенческие методы, связанные с ними внутри вездесущего языка, помещаются в отдельные классы, классифицирует ли это как модель анемии или богатого домена?

Например, вместо того, чтобы это на моем лице:

class Order 
{ 
    public virtual void Ship(); 
} 

Я на самом деле это учтен в отдельный класс OO:

class Shipper 
{ 
    public virtual void Ship(Order order); 
} 

С моей точки зрения, это еще внутри «модели», а не уровня сервиса/приложения, поэтому я считаю, что это все равно будет моделью с богатым доменом.

Я, однако, может делегировать вызов получения моего заказа и доставки его внутри слоя службы следующим образом:

class OrderService 
{ 
    //private member construction ommitted for brevity 
    Repository _repository; 
    ShipOrder _shipper; 
    public void Ship(int orderId) 
    { 
     Order order = _repository.GetOrder(orderId); 
     _shipper.Ship(order); 
    } 
} 

Причина НЕ реализации поведенческой логики внутри домена сущности является то, что его реализация будет идти против принцип единой ответственности, поскольку ответственность моего лица заключается в том, чтобы поддерживать и хранить состояние в моем домене. Однако мое мнение об этом может быть субъективным.

+0

Задать вопрос, что это означает для доставки заказа? Как это влияет на состояние системы? Какие инварианты необходимо применять и какие другие компоненты играют в процессе доставки (например, внешняя система)?В конце может стать ясно, следует ли использовать службу домена или разместить поведение в AR. – plalx

ответ

1

Насколько я понимаю, грузоотправитель и заказ - это две разные концепции в вашем домене (не технически говорящие). Если это так, , отделяющий их, является правильным выбором, потому что вы должны проектировать свою модель домена как можно ближе к реальному миру.

0

Что такое грузоотправитель? Специалисты вашего домена много говорят о грузоотправителях? Разве разные отправители отправляют заказы по-другому? Я сомневаюсь, что кто-то, работающий в магазине, расскажет о грузоотправителе. в лучшем случае они будут говорить о сотруднике, который отправляет заказ.

Я думаю, что разделение их «возможно» будет прекрасным, но тогда грузоотправитель будет обслуживать домен. DDD - это больше о снижении коммуникационного барьера, чем о единственном принципе ответственности. В DDD я сомневаюсь, что он поместился бы в вашу модель домена по той простой причине, что эксперт домена не будет говорить об этом. Они говорили о доставке заказа.

то, что вы могли бы сделать это

class Order { 
     public void Ship() { 
      IOCContainer.Resolve<IShippingService>.ShipOrder(this); 
     } 
} 

Теперь вы можете поместить всю фактическую логику внутри службы доставки (который реализует интерфейс IShippingService). Это также решает принцип единой ответственности. Если вы прочтете комментарии дяди Боба о единственном принципе ответственности, это не столько о том, чтобы делать только одну вещь, но и иметь одну причину изменения. https://blog.8thlight.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html

Если я реализую свою логику доставки, как это, я бы ожидал, что эта часть моего кода не будет иметь никаких причин для изменения в al (поскольку изменения в процессе доставки не будут находиться здесь, а в ShippingService).

Таким образом, вы можете комбинировать DDD и SOLID.

+0

Что я могу сделать, чтобы улучшить этот ответ? – Batavia

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

  • Нет связанных вопросов^_^