Комментарии 15
Сигнатура метода в AutoSpec
PS: Не знаю как другим, для меня использование =>, когда строчек больше, чем одна, не прибавляет коду читаемости. Скорее наоборот.
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 есть возможности комбинирования. Я узнаю тут паттерн Спецификация
В случае с AutoSpec такой возможности, как я понял, нет и не предвидится. И вообще спецификация ли это тогда?
(spec1 && spec2).Equals(spec1 && spec2);
В случае с AutoSpec такой возможности, как я понял, нет и не предвидится. И вообще спецификация ли это тогда?
НЛО прилетело и опубликовало эту надпись здесь
Верно, но в начале статьи определение Спецификации построено именно на этом. Аккуратнее с копированием определений паттернов проектирования из вики.
om2804, предостерегать от копирования нужно меня, а неxyzuvw :) Я действительно не очень точно сформулировал свои мысли. Посыл был такой:
Expression<Func<T, bool>>
— это уже компонуемая спека. Но чтобы сделать красивые And и Or нужно попотеть с ParameterRebinder
. Поэтому, я решил провести небольшой рефакторинг и теперь код мне нравится даже больше.НЛО прилетело и опубликовало эту надпись здесь
IsDeleted == false, серьёзно? Я думал так только новички пишут
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Шаблон проектирования «Спецификация» в C#