CQRS - Передача сложных данных подкачки / фильтрации через домен - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь реализовать шаблон cqrs с помощью mediatr, и все настроено правильно и работает хорошо. Однако у меня есть проблема при попытке реализовать компоненты devextreme в моих представлениях. Для компонентов требуется конечная точка, которая принимает объект DataSourceLoadOptions, который затем может быть связан с классом DataSourceLoader и объектом IQueryable для автоматизации фильтрации / разбиения по страницам / сортировки и т. Д. c. Этот код - fantasti c, и он действительно избавляет от множества типичных вещей.

Вот пример «старого способа», который я использовал, чтобы делать вещи:

[HttpGet]
public virtual object Get(DataSourceLoadOptions loadOptions)
{
    var queryable = this.context.Set<TEntity>();

    return DataSourceLoader.Load(queryable, loadOptions);
}

Как Вы можете видеть, что это действительно неплохо, однако это старая школа, а не многослойная, и она связывает меня с EF как механизмом постоянства. Но теперь заменить его шаблоном CQRS будет немного сложно, потому что я не хочу, чтобы мое приложение, домен или даже уровень базы данных знали о devextreme (это технология представления и она должна оставаться там). Я также не очень заинтересован в возвращении простого IQueryable из ответа mediatr, поскольку это означает, что такие вещи, как поддержание контекста / проблемы с тестируемостью / некоторые запросы Linq не могут быть реализованы в int SQL et c ... пахнет плохо.

Мне интересно, есть ли другой способ как-то извлечь интерфейс, а затем, возможно, создать сервис, который я могу внедрить через DI, чтобы решить эту проблему? Я не могу найти какие-либо ресурсы на net относительно этого. Как обычно, все примеры - это просто примеры использования "hello world", и ни один из них действительно не запачкает свои руки проблемами "реального мира", такими как фильтрация / пейджинг / идентификация и т. Д. c

Если у кого-то есть какие-либо идеи Пожалуйста, укажите мне в правильном направлении

1 Ответ

1 голос
/ 12 марта 2020

Мы используем Kendo UI, но проблема та же. Мы возвращаем IQueryable<T> из наших запросов для случаев, когда нам нужно сделать подкачку для пользовательского интерфейса. И затем у нас есть тест, который гарантирует, что запрос может быть выполнен с чистым SQL.

Примерно так:

public class MyProjectQuery : IQuery<IEnumerable<Project>
{
// params
}

[HttpGet]
public virtual object Get(DataSourceLoadOptions loadOptions)
{
    var queryable = _mediator.Query(new MyProjectQuery());

    return DataSourceLoader.Load(queryable, loadOptions);
}
...