У нас есть требование добавить напоминание о событии, когда пользователь вводит свой адрес электронной почты на странице событий. Событие - еще один объект домена. Наша первоначальная мысль была создать объект домена клиента и связанные с ними сервисными службами:Устройства для тестирования объектов домена
public class CustomerService {
public void AddEventReminder(string emailAddress, int eventId) {
var customer = new Customer(emailAddress);
customer.AddEmailReminder(eventId);
}
}
Как мы можем убедиться в модульном тесте, что метод AddEmailReminder действительно призвали новый клиент?
Мои мысли:
- Используйте завод, чтобы создать клиента. Это пахнет, потому что я думал, что вы должны использовать фабрику, где была какая-то сложность в создании объекта.
- Плохой код. Может быть, есть лучший способ сделать это?
- Moq магии.
Отдельная заметка (возможно, это связано), как мы решаем, какой из них является общим корнем? Мы произвольно решили, что клиент, но это может быть и событие. Я читал и понимаю статьи об общих корнях, но в этом сценарии неясно.
. Весь смысл этого метода службы домена заключается в том, что он вызывается непосредственно из службы приложения, которая получила dto с адресом электронной почты и идентификатором события. Я решил, что объект домена должен иметь дело только с полными объектами, поэтому служба домена должна это обработать. Я не понимаю, почему это анемия означает, что он не должен идти на службу домена, если что-нибудь, я думаю, будет наоборот, поскольку объекты домена связаны с логикой. Re, совокупный корень, я согласен, что они оба являются совокупными корнями, вопрос, который я задавал, заключается в том, какой агрегированный корень отвечает за ассоциацию? – JontyMC
... интересный ответ, хотя. Если я должен был изменить подпись, какой код будет отвечать за создание агрегатного корня клиента? Возможно, это более уместный вопрос. – JontyMC
Я подозревал, что услуга должна была отобразиться из прикладного уровня. Однако в этом случае это не доменная служба - это служба уровня приложения и принадлежит к этому слою. В этом случае, я думаю, вам нужна абстрактная фабрика (возможно, CustomerRepository), которая может искать существующего клиента на основе адреса электронной почты. –