Прошел почти год с тех пор, как я задал этот вопрос, и я и моя команда с тех пор многому научились.Вот как я бы ответил на этот вопрос сегодня:
Домен должен представлять (в коде), чем занимается бизнес (или в реальной жизни).Таким образом, доменные объекты - это артефакты или акторы, обнаруженные в этом реальном бизнесе.Какое поведение имеют эти артефакты и актеры Rea-Life?Все это.В свою очередь, какое поведение ДОЛЖНЫ иметь доменные сущности на них?Все это.
Например, в реальной жизни менеджер может нанять нового сотрудника.Представление домена должно включать такие объекты, как «менеджер» и «новый сотрудник».Менеджер - актер, здесь.
//newEmployee comes from somewhere else... possibly the UI
//someManagerId comes from the logged in user
var manager = _repository.Get<Manager>(someManagerId);
manager.Hire(newEmployee);
Итак, сущность менеджера здесь моделирует / отражает поведение реального бизнеса.Альтернатива - пропустить управляющую сущность как актера и отодвинуть его в угол, чтобы тяжелая «служба домена» могла выполнить всю работу ... вот так:
//newEmployeeService comes from somewhere else... possibly injected using IOC
newEmployeeService.Create(newEmployee, someManagerId);
ВВ случае анемичного домена вы могли бы использовать подобную службу для создания или найма сотрудника.Это работает, но это не выразительно, и поведение не так заметно.Кто что делает?Почему менеджер должен создать нового сотрудника?
Я думаю, что когда я первоначально задал вопрос, я хотел попытаться включить в свои сущности больше поведения, но я действительно не знал, какбез внедрения служб в мои сущности (например, с помощью инжектора конструктора).С тех пор мы выучили несколько новых трюков, а сущности нашей команды суперэкспрессивны.Вот вкратце, что мы делаем:
- Мы стараемся, когда это возможно, использовать субъекты-актеры, чтобы выразить человека или предмет, который выполняет действие.
- Актеры имеютметоды, которые выражают действия, которые они могут выполнять
- Когда требуется служба, она внедряется в качестве аргумента в метод, в котором она используется.
- Мы запускаем события домена, используя BlingBag для каждого метода в каждой сущности домена, чтобы обеспечить расширяемость и дать сущностям возможность самосохранения.