Исходя из того, как вы это описали, я бы сказал, что это лучше всего сделать на уровне служб приложений.(слой Задачи в примере проекта WhoCanHelpMe?).Для меня это логика приложения, а не логика домена.
Для других опций:
- Sharp разработан специально, чтобы сущности не могли получить доступ к репозиториям.(Вы найдете довольно много статей о том, почему сущности должны игнорировать постоянство.)
- В общем, контроллеры не предназначены для непосредственного размещения какой-либо бизнес-логики - для удобочитаемости, тестируемости и т. Д.(Лично мне удобно сначала вводить логику, а затем рефакторинг.)
Одна из причин, по которой мне было бы неудобно размещать логику непосредственно в хранилище, это ясность.Если у вас есть методы в IChatRoomRepository:
ChatRoom GetRoomByName (string name);
ChatRoom GetRoomById (int id);
, обычно GetRoomById возвращает ноль, если нет места для данного идентификатора, поэтому не слишком очевидно, что первый метод будет тихо создавать (и предположительно сохраняться?)комната, если у вас ее еще нет.
Концептуально, с DDD Быстро (p56):
Мы не должны смешивать хранилище с фабрикой,Фабрика должна создавать новые объекты, а Репозиторий должен находить уже созданные объекты.Когда новый объект должен быть добавлен в репозиторий, он должен быть сначала создан с использованием фабрики, а затем он должен быть передан в репозиторий
, что предполагает, что если вы пытаетесь реализоватьшаблон хранилища, создание новой комнаты чата должно происходить вне хранилища.