DDD ( ДДД ):Пытаетесь закодировать сортировку и фильтрацию, поскольку это относится к Poco, репозиторию, DTO и DAO, используя C #?
-
20-09-2019 - |
Вопрос
Я получаю список элементов из моего репозитория.Теперь мне нужно отсортировать и отфильтровать их, что, я полагаю, было бы сделано в репозитории для повышения эффективности.Я думаю, что было бы два способа сделать это способом DDD:
- Отправьте фильтр и объект сортировки, полный условий, в репозиторий (как это называется)?
- В результате репозитория будет создан объект с .методами filter и .sort?(Это не будет POJO / POCO, потому что он содержит более одного объекта?).
Итак, является ли ответ 1, 2 или другим?Не могли бы вы объяснить, почему?Я склоняюсь к # 1, потому что репозиторий сможет отправлять только те данные, которые я хочу (или # 2 сможет задерживать доступ к данным, таким как LazyList?) Пример кода (или ссылка на веб-сайт) был бы очень полезен.
Пример:
- Продукт product = repo.GetProducts(mySortObject, myFilterObject);// Список Poco
- продукт.Добавить фильтр ("цена", "Меньше", "3,99");товар.Добавляет сортировку ("цена", "по убыванию");
Решение
Это не полный ответ, но вы, возможно, захотите взглянуть на некоторые идеи, лежащие в основе CQRS (разделение ответственности за командный запрос) (можно найти несколько хороших ссылок здесь).
CQRS - это способ мышления о DDD, который может помочь прояснить некоторые из этих вопросов.Это на более высоком уровне, чем ваш конкретный вопрос, но это может помочь.
По сути, я думаю, что это просто поможет вам выбрать ваш первый вариант (к которому я пришел в аналогичной ситуации).Мы назвали это Объектом запроса.
Другие советы
Лично я бы предпочел ваш первый вариант.
Если вы рассматриваете второй вариант с точки зрения DDD, то объект product, который, как я предполагаю, является объектом вашего домена, обладает знаниями о чем-то, что на самом деле не является частью бизнес-проблемы, которую вы пытаетесь решить (т.е. вашего домена).Скорее сортировка и фильтрация используются в пользовательском интерфейсе или каком-либо другом компоненте внутренней обработки.
Кроме того, рассматривая второй вариант с точки зрения единой ответственности (он же SOLID), вы увидите, что ваш Product
бизнес-объект отвечает за сортировку и фильтрацию, то есть за то, что вообще не связано с продуктом.
Вот как я смотрю на вещи.Мне было бы интересно узнать мнения других.