Контракты на обслуживание и доменные объекты
Скажем, у меня есть два интерфейса для моего приложения:
- Веб-интерфейс
- Серверная часть, которая предоставляет данные
Они оба общаются с веб-сервисом, и этот веб-сервис, в свою очередь, обрабатывает бизнес-логику и взаимодействует с отдельным слоем данных, в котором хранятся объекты.
Итак, если каждый клиент веб-сервиса использует DataContracts этого веб-сервиса, для чего мне нужны доменные объекты?
Где здесь подходит управляемый доменом и какие преимущества он дает моей архитектуре?
Или это тот случай, когда то, что у меня уже есть, хорошо, и мне вообще не нужны доменные объекты?
Я неправильно понимаю значение и цель доменного дизайна?
2 ответа
Для чего мне нужны доменные объекты?
Возможно, вам не нужны доменные объекты в вашем приложении. Как правило, DDD вписывается в уровень обслуживания следующим образом: уровень обслуживания предоставляет свои контракты на эксплуатацию и контракты на данные. Классы контракта данных часто соответствуют объектам в вашем домене, но они не являются объектами домена, потому что они не имеют никакого поведения, они представляют собой только представление данных, связанных с конкретной службой. Вот простой пример взаимодействия между объектами контракта данных и объектами домена в сервисе:
public MyEntityDto GetMyEntity(string id) {
var entity = this.myEntityRepository.Get(id);
if (entity == null)
return null;
return new MyEntityDto(entity);
};
В этом случае MyEntityDto является объектом DTO для MyEntity, он служит для предоставления определенных свойств MyEntity, которые служба желает предоставить своим клиентам.
Значение DDD вступает в игру, когда ваш домен более сложный и имеет соответствующее поведение:
class MyEntity {
public void ChangeState(MyEntityState state) {
if (!IsValidState(state))
throw new Exception("Not a valid state.");
// further domain logic here...
}
}
[DataContract]
class ChangeStateCommand {
[DataMember]
public string MyEntityId { get; set; }
[DataMember]
public string State { get; set; }
}
public void Process(ChangeStateCommand command) {
var entity = this.myEntityRepository.Get(command.MyEntityId);
if (entity == null)
throw new SomeException().
entity.ChangeState(command.State);
this.myEntityRepository.Commit();
}
В этом случае данные, переносимые моим ChangeStateCommand, используются для работы с вашим доменным объектом.
Контракты на данные - это не что иное, как сообщения, которыми ваш клиент и сервер обмениваются между собой.
Ваша служба WCF - это тот уровень, который принимает сообщения и обрабатывает их, чтобы они могли обрабатываться вашей бизнес-логикой.
Ваши доменные объекты будут вашей бизнес-логикой, которая принимает обработанные сообщения, выполняет необходимые действия, а затем применяет любые события, которые необходимо применить.
Если вы следуете более принципу разделения команд и запросов (CQS), то ваши команды (вставки / обновления / удаления) будут запущены для службы WCF и ничего не возвращают. Ваш клиент будет запрашивать чтение из вашей службы WCF отдельно от ваших команд (это означает, что команда InsertOrder не возвращает Order - вы должны выполнить отдельный запрос для этого).
Во всем этом ваши контракты на передачу данных являются сообщениями от и к вашей службе WCF. Ваш домен стоит за этой службой, которая обрабатывает всю бизнес-логику, которая должна произойти, чтобы сделать ваши чтения максимально точными.
Я отвечаю на это с большей точки зрения CQRS (разделение ответственности командного запроса), но я надеюсь, что это объясняет, откуда я.
Чтобы ответить на ваш другой вопрос: - вам нужны доменные объекты -> я бы сказал, да, вы должны