Интерфейс с сервисным уровнем или доменными объектами сами? (DDD)

StackOverflow https://stackoverflow.com/questions/4300859

Вопрос

Я все еще узнаю о DDD, и у меня есть эти два (вероятно, простые) вопросы:

Если Фабрика создает новый объект / график /совокупность случаи, но также и "восстановление" Объекты / графики из Репозиторий, потом:

(1) В ваших функциях / заданиях / задачах / задачах / единицах / единицах работают на завод или поведенческий метод на экземпляре объекта или функции Domainservice? Я потерян в отношении стека на вызове, основанный на ответственности этих компонентов.

(2) Есть ли экземпляры сущности даже «поведенческие методы», как выше? Например, есть ли пост p.UpdatePost(string bodyText) Или это не является проблемой доменной модели, и поэтому с репозиторием должно быть достигнуто то же самое? Или функция уровня сервиса, должна ли он вызов репозиторию в этом случае, а экземпляр объекта просто обладает поведенческими методами, которые характерны для домена, а не настойчивость? Но тогда, почему это звучит как «обновление поста» - это доменная функция, когда это цель пользователя?

Вы можете увидеть, что я повсюду. Пожалуйста помоги.

Это было полезно?

Решение

(1) Функции вашего уровня обслуживания/задания/задачи/задачи/подразделение работы на завод или поведенческий метод на экземпляре объекта или функции домена? Я потерян в отношении стека на вызове, основанный на ответственности этих компонентов.

Обычно - верхний уровень получает необходимый агрегатный корень и вызывает на него функцию. Иногда верхний уровень получает несколько корней агрегатов и передает их в службу домена, но не часто потому, что служба домена является довольно сильным признаком того, что существует нераспознанный корень совокупности. В конце - верхний уровень гарантирует, что совокупный корень сохраняется.

(2) Есть ли экземпляры сущности даже «поведенческие методы», как выше? Например, имеет пост P.Updatepost (строковый BodyText) или заключается в том, что не забота о модели домена и поэтому то же самое должно быть достигнуто с помощью репозитория? Или функция уровня сервиса, должна ли он вызов репозиторию в этом случае, а экземпляр объекта просто обладает поведенческими методами, которые характерны для домена, а не настойчивость? Но тогда, почему это звучит как «обновление поста» - это доменная функция, когда это цель пользователя?

Да, они делают. Доменная модель должна знать об изменениях состояния. И это гораздо более полезно, как это кажется сначала. Отличная вещь об этом в том, что вы получаете точку расширения. Если клиент будет ходить через неделю и скажет, что он хочет, чтобы система проверяла дополнительные вещи, когда пользовательские обновления публикуются, вместо поиска каждой строки post.bodyText="new value", Вы сможете пойти прямо к post.UpdatePost метод и прикрепите необходимые вещи там.

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

Имейте в виду, что дизайн управляемого доменом имеет смысл только для сложных приложений. Простое приложение блога не нуждается в этом.

(3) Я ошибаюсь, если предположить, что уровень обслуживания (не доменные услуги) должен инкапсулировать, как интерфейс взаимодействует с доменным уровнем?

Как я вижу - услуги приложений больше предназначены для оркестровки инфраструктуры. Если нет никакой инфраструктуры - тогда сервис приложений проигрывает значение:

Прикладные услуги в основном являются лишь фасадами. И каждый фасад плохой, если сложность добавляет избыточные проблемы, которые он решает.


Внутри домена:

//aggregate root is persistence ignorant. 
//it shouldn't reference repository directly
public class Customer{
  public string Name {get; private set;}
  public static Customer Register(string name){
    return new Customer(name);
  }
  protected Customer(string name){
    //here it's aware of state changes.
    //aggregate root changes it's own state
    //instead of having state changed from outside
    //through public properties
    this.Name=name;
  }
}

//domain model contains abstraction of persistence
public interface ICustomerRepository{
  void Save(Customer customer);
}

Снаружи домена:

public class CustomerRepository:ICustomerRepository{
  //here we actually save state of customer into database/cloud/xml/whatever
  public void Save(Customer customer){
    //note that we do not change state of customer, we just persist it here
    _voodoo.StoreItSomehow(customer);
  }
}

//asp.net mvc controller
public class CustomerController{
  public CustomerController(ICustomerRepository repository){
    if (repository==null)throw new ArgumentNullException();
    _repository=repository;
  }
  public ActionResult Register(string name){
    var customer=Customer.Register(name);
    _repository.Save(customer);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top