Pull to refresh

Comments 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, добавили названия полей, который вам нужно фильтровать. Готов фильтр. При этом логику фильтрации вы не пишете, вы только указываете названия полей. Сам тип нужен для:
  • Того чтобы явно указать какие поля можно фильтровать/сортировать, а какие — нет
  • Передать мета-информацию на фронт, чтобы тот самый грид с фильтрацией, пагинацией сгенерировать, а не писать руками

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

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

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

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

Sign up to leave a comment.

Articles