В последнее время я реорганизую свой проект DDD. Когда я смотрю на свой уровень репозитория. Я нашел, что возвратил IQueryable < T> в моем репозитории. Я озадачен и должен ли я вернуть IQueryable < T> из репозитория в моем проекте DDD в хранилище? Обычно я возвращаю тип IQueryable в моем проекте репозитория. Но сегодня я нашел противоположную идею от этого article Я не могу понять это!Должен ли я возвращать IQueryable <T> из репозитория в DDD
ответ
Если вы вернетесь IQueryable
, вы разрешаете доменным знаниям утечка из уровня домена на потребительские слои. Это увеличивает риск того, что объекты вашего домена станут анемичными, и все поведение переместится на другие уровни.
Хотя это швы очень удобно возвращать IQueryable
, и вы думаете, что ваш код станет проще, это просто иллюзия; когда проект будет расти, то IQueryable
преобразует ваш код в большой шар грязи, причем код домена разбросано где угодно. Вы не сможете оптимизировать свой репозиторий или изменить одно постоянство на другое (т. Е. От sql до nosql).
Возможно, вы не должны этого делать.
Задача репозитария не только абстрагироваться от деталей постоянства, но и для обеспечения explicit query contract определения тех, которые необходимы для процесса команды в домене.
Если вам необходимо дополнительно фильтровать/преобразовывать то, что было возвращено из вашего репозитория, то вам, скорее всего, не удалось зафиксировать явный запрос, который должен быть частью контракта хранилища.
Имея такой контракт, клиенты-клиенты могут выразить свое намерение и упростить оптимизацию.
1. В настоящее время довольно часто применять некоторые принципы CQRS и басовую модель домена полностью для запросов. Учитывая этот сценарий, единственными запросами, которые будут проходить через репозиторий, являются те, которые необходимы для обработки команд. Тем не менее, вы не вынуждены каким-либо образом использовать этот подход, чтобы ваш репозиторий мог также выполнять запросы на отчетность, если хотите.
Что я должен вернуться в репозиторий? – doublnt
'IEnumerable' или' IReadOnlyList' кажутся более подходящими. – guillaume31