Фон: Для моей собственной ясности/самообразования я пытаюсь реализовать простое приложение для ввода заявок с использованием TDD + DDD. Моя основная цель - сохранить архитектуру чистой, разделив проблемы.
У меня есть четыре слоя (на данный момент)...
-
Стойкость/DAL с классом CustomerRepository, который может выполнять GetById, Save, операции над "агрегированным корнем", Клиентом и связанными с ним ордерами и OrderItems. Чтобы обеспечить "инъекцию зависимости бедных людей"
-
Уровень домена /BLL, содержащий классы бизнес-объектов, которые выполняют мелкомасштабные операции, чтобы помочь создавать новые заказы, применяя налоговые, скидки, логику доставки на основе размера заказа и местоположения клиента.
-
Прикладной фасад (службы приложений/оркестровка), содержащий короткие, более грубые классы для организации "бизнес-сущностей" и уменьшения болтовни с презентацией (и, возможно, уровня WebServices).
-
Уровень представления
Кроме того, я хочу передать POCO DTO между ключевыми слоями... в частности между уровнями Persistence = > Domain и ApplicationFacade = > Presentation. Итак, у меня есть CustomerDto, OrderDto, OrderItemDto с соответствующими отношениями, определенными в общем пакете.
Я хочу внедрить реализацию ICustomerRepository в класс "бизнес-объект" Customer с использованием Constructor Injection, а затем вызвать Customer.Save() в "бизнес-сущности", чтобы запустить процесс создания/обновления, в конечном итоге вызвать Сохранить метод в CustomerRepository. В конце концов, Клиент является "совокупным корнем" и имеет всю необходимую информацию для сохранения... он также является "хранителем" введенного CustomerRepository.
Проблема: Здесь я попал в ловушку. Я хочу, чтобы уровень Domain/BLL был как можно более чистым и не связывал его с сторонними фреймворками и API-интерфейсами, , но метод Customer.Save() должен переводить "совокупный корень" клиента, и все его Заказы и OrderItems в их версии DTO для транспорта на вложенный слой Persistence CustomerRepository... и это работа для Automapper.
Проблема в том, что... Если я не стану Automapper в слое Domain/BLL, я не уверен, что , где он должен идти.
Неплохо, если вы поместите его в ApplicationFacade, даже если это задание - оркестровка.
Он определенно не хочет помещать его в слой Domain/BLL, потому что я хочу сохранить его в чистом виде.
Поэтому я чувствую, что что-то пропустил... что я приближаюсь к этому с фундаментальным непониманием того, как рабочие части должны собраться вместе для выполнения этой задачи. Какие-либо предложения? (Пожалуйста, будьте осторожны, я новичок во всем этом, и новичок в SO. Сообщите мне, если мне нужно показать какой-то код того, что у меня есть до сих пор.)