Архитектура, которая позволяет динамически фильтровать / запрашивать репозиторий <SomeDomainModel> - PullRequest
0 голосов
/ 13 декабря 2011

Я ищу надежную архитектуру, которая решит следующую проблему:

Как пользователь, я хочу динамически фильтровать некоторую базу данных людей, динамически добавляя критерии.Я также хочу иметь возможность пакетного обновления только выбранных полей в базе данных на основе результатов фильтра.

Справедливо следующее:

  • У меня есть трехуровневое решение (GUI, бизнес-уровень, уровень доступа к данным).
  • Предположим, у меня есть Repository<Person>, Person - модель домена.
  • Хранилищеподдерживает linq и может дать мне: IQueryable<T> GetAll()

У меня есть несколько идей:

  • Я думаю об использовании API динамического выражения, которыйрасширяет функциональность LINQ, так что я могу динамически добавлять критерии поиска.
  • Я смотрел на NHibernate QueryBuilder, и это может быть чем-то, заимствовать идеи.

Теории решений:
Итак, в любом случае я думаю о графическом интерфейсе, который просит DomainModel описать себя (какие свойства существуют, какие операторы разрешены и какие допустимые типы значений). Таким образом, я мог бы сделать некоторые каскадные выпадающие списки длясвойства и разрешенные операторы.Я подумываю описать свойства либо с помощью метода в модели, например: DescribeMyself();, а затем объединить это с украшением свойств с помощью атрибутов.

Вопросы:
Итаккак насчет описания свойств для модели, как бы вы это сделали?Например, свойство: string Name должно быть доступно для поиска либо с оператором Equals, либо с оператором Like.
А как насчет перечислений?Представь себе MyGenderEnum Gender.При выполнении фильтра Equals мне нужно описать, что он должен соответствовать любому значению в данном Enum.

Что-то, о чем подумать!

1 Ответ

0 голосов
/ 13 декабря 2011

Это довольно широкий вопрос.

Всего несколько пунктов:

  • Динамическое добавление критериев поиска в IQueryable<T> поддерживается сразу после установки.Просто добавьте вызов к Where для каждого критерия:

    repository.GetAll<Person>().Where(x => criteria1(x)).Where(x => criteria2(x));

  • Я бы не стал делать описание модели самостоятельно.Я бы создал новый класс, похожий на Fluent NHibernates ClassMap<T> или Fluent Validations AbstractValidator<T>.

...