Запретить дублированные выражения для разных типов с одинаковыми свойствами - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть два метода сортировки в абстракции для моего обработчика запросов медиатора. Первый обрабатывает Expression<Func<T,object>> для базы данных с сущностью, а второй обрабатывает то же самое для IEnumerable с ViewModel. Свойства и так далее всего выражения одинаковы для обоих, кроме типа. (DatabaseModel и ViewModel)

Мой вопрос: есть ли способ реализовать это и предотвратить почти одинаковую реализацию выражений в классах ISortConditions? Один для ViewModel и один для Entity. Или я должен определенно go с разделенными классами для различных типов из-за некоторого принципа, который я еще не изучил?

  public abstract class AbstractRequestHandler<T> where T : class, ISortable, new()
    {

        protected IQueryable<T> SortView(ISortConditions<T> sorting, IQueryable<T> value)
        {

            var ordered = value.OrderBy(sorting.OrderBy());
            foreach (var thenby in sorting.ThenBy())
            {
                ordered = ordered.ThenBy(thenby);
            }
            return ordered;
        }

        protected async Task SortEnumerableBy<TGroups, TItem>(ISortConditions<TItem> sorting,
            ObservableRangeCollection<TGroups> value) where TItem : class, ISortable, new() where TGroups : ObservableRangeCollection<TItem>
        {
            await Task.Run(async () =>
            {
                value.ForEach(async fe =>
                    fe.InternalSort(await Task.Run(() =>
                       {
                           var result = fe.OrderBy(sorting.OrderBy().Compile());
                           sorting.ThenBy().ForEach(fea =>
                           {
                               result = result.ThenBy(fea.Compile());
                           });
                           return result;
                       })
                ));
            });
        }

Реализация ISortCondition, которую необходимо дублировать для каждой пары Entity / ViewModel.

public class OrdersViewSorting : ISortConditions<OrdersView>
    {     
private List<Expression<Func<OrdersView, object>>> ThenBy
        {
            get
            {
                return new List<Expression<Func<OrdersView, object>>>()
                {
                    ordersView=>ordersView.OrderId,
                    ordersView=>ordersView.OrderDate
                };
            }
        }

        private Expression<Func<OrdersView, object>> OrderBy
        {
            get
            {
                return ordersView => ordersView.UpdateTime;
            }
        }

        string ISortConditions<OrdersView>.Title()
        {
            return Title;
        }

        List<Expression<Func<OrdersView, object>>> ISortConditions<OrdersView>.ThenBy()
        {
            return ThenBy;
        }

        Expression<Func<OrdersView, object>> ISortConditions<OrdersView>.OrderBy()
        {
            return OrderBy;
        }
...