Как стать автором
Обновить

Комментарии 15

Сигнатура метода в AutoSpec
IQueryable<TProjection> Apply(IQueryable<TProjection> query)
выглядит странно. Не понятно что оно должно делать. Можете привести пример как этим пользоваться? Спасибо!

PS: Не знаю как другим, для меня использование =>, когда строчек больше, чем одна, не прибавляет коду читаемости. Скорее наоборот.
public class SomeFilter: AutoSpec<MyNiceEntity>
{
    public string Name {get;set;}
    
    public int? Rating {get;set;}
}


Если Name заполнен, то будет query = query.Where(x => x.StartsWith(Name)). Если Rating будет не null, то query = query.Where(x => x.Rating == Rating)
А можете объяснить чего Вы добились, используя такой подход? Т.е. какие плюсы подхода перевесили минусы в вашем случае.
Потому что
можно написать базовый объект для фильтрации чего-угодно
я здесь что-то не увидел. Получаем базовый класс, который подходит только для entities, у которых есть свойства Name и Rating. Очень большой риск использовать этот базовый класс не правильно, что приведёт к ошибке в run time
Вот представьте, что вам нужно выпускать по 30 CRUD-интефрейсов в месяц. Все с фильтрацией, пагинацией, сортировкой и формами для создания/редактирования. Унаследовали вы AutoSpec, добавили названия полей, который вам нужно фильтровать. Готов фильтр. При этом логику фильтрации вы не пишете, вы только указываете названия полей. Сам тип нужен для:
  • Того чтобы явно указать какие поля можно фильтровать/сортировать, а какие — нет
  • Передать мета-информацию на фронт, чтобы тот самый грид с фильтрацией, пагинацией сгенерировать, а не писать руками

Естественно, что это решение, которое работает на большом объеме простых задач и для запуска космических кораблей в туманность Андромеды не подходит.
НЛО прилетело и опубликовало эту надпись здесь
Абсолютно верно. AutoSpec — для того, чтобы молотить CRUD в огромных количествах. К сожалению && и || по-человечески не переопределишь, потому что это потребует базового класса Specification, чего я делать не хочу по причинам, описанным в начале статьи.
К сожалению && и || по-человечески не переопределишь

И если опять же смотреть на определение паттерна Спецификация из начала статьи, AutoSpec это точно реализация спецификации? Где же та цепочка объектов, связанных операциями булевой логики?
НЛО прилетело и опубликовало эту надпись здесь
LinqSpecs есть возможности комбинирования. Я узнаю тут паттерн Спецификация
(spec1 && spec2).Equals(spec1 && spec2);

В случае с AutoSpec такой возможности, как я понял, нет и не предвидится. И вообще спецификация ли это тогда?
НЛО прилетело и опубликовало эту надпись здесь
Верно, но в начале статьи определение Спецификации построено именно на этом. Аккуратнее с копированием определений паттернов проектирования из вики.
om2804, предостерегать от копирования нужно меня, а неxyzuvw :) Я действительно не очень точно сформулировал свои мысли. Посыл был такой: Expression<Func<T, bool>> — это уже компонуемая спека. Но чтобы сделать красивые And и Or нужно попотеть с ParameterRebinder. Поэтому, я решил провести небольшой рефакторинг и теперь код мне нравится даже больше.
Предостерегаю всех. Так уж получилось, что диалог состоялся с xyzuvw
НЛО прилетело и опубликовало эту надпись здесь

IsDeleted == false, серьёзно? Я думал так только новички пишут

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории