Является ли шаблон спецификации устаревшим, когда вы можете использовать Dynamic LINQ?

Википедия утверждает, что шаблон спецификации — это место, где бизнес-логика может быть повторно объединена путем объединения бизнес-логики вместе с использованием логического значения. логика. Что касается выбора объектов фильтрации из списков или коллекций, мне кажется, что Dynamic LINQ позволяет мне делать то же самое. Я что-то упускаю? Есть ли другие преимущества шаблона спецификации, которые также следует учитывать?


Редактировать:

Я нашел несколько сообщений, в которых обсуждается объединение LINQ и шаблона спецификации:

Проект спецификаций Linq

Реализация шаблона спецификации с помощью Linq, Николас Блумхардт (чувак из Autofac)

Кто-нибудь прошел эту дорогу и стало ли ее сложно поддерживать?


person David Robbins    schedule 21.09.2009    source источник
comment
Я в значительной степени сталкиваюсь с этой точной ситуацией прямо сейчас, поэтому этот вопрос представляет для меня большой интерес.   -  person Michael Cook    schedule 21.09.2009


Ответы (4)


Dynamic LINQ использует строковые выражения, чтобы разрешить построение динамического запроса. Таким образом, мы действительно теряем безопасность типов. Принимая во внимание, что использование шаблонов-оболочек, таких как шаблон декоратора его тесно связанного воплощения, шаблон спецификации, позволяет нам поддерживать безопасность типов в коде. Я изучаю использование шаблона декоратора в качестве оболочки запросов для повторного использования и динамического создания запросов. Статью о проекте кода можно найти по адресу: Linq Query Wrappers.

Или вы можете проверить мой блог.

person Anas Karkoukli    schedule 15.07.2010

Я разработчик C# и предпочитаю использовать шаблон спецификации, потому что он ближе к моему бизнесу. Более того, в этом шаблоне нет ничего удивительного, если класс спецификации существует, он должен работать. С Linq ваш базовый провайдер может не реализовывать некоторые функции, и вы не узнаете об этом до времени выполнения.

Но, безусловно, самое большое преимущество спецификации по сравнению с linq заключается в том, что она ближе к бизнесу, это мини-DSL. LINQ для меня — это DSL для сбора запросов, а не для бизнес-домена.

person Nicolas Dorier    schedule 21.09.2009

LINQ:

var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();

Спецификация:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
  • Бизнес-логика заключена в спецификацию (с именем, которое показывает, что это такое).
  • СУХОЙ: вы не повторяете этот linq по коду, вы просто используете спецификацию

Мне нравится использовать спецификацию, когда я считаю, что правило достаточно важно, чтобы быть явным в коде, и оно не принадлежит естественно сущности.

Пример:

public class Customer
{
    //...

    public bool IsAbleToReceiveCredit(decimal creditValue)
    {
        var secureAge = this.Age > 18 && this.Age < 60;
        var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue;

        return secureAge && personalAssetsGreaterThanCreditValue;
    }
}

От Customer ответственности зависит, сможет ли он получить какое-то вознаграждение? Банк спросит у клиента, может ли он получить кредит?

Возможно нет.

Таким образом, с помощью спецификации вы можете удалить эту логику из Customer (она никогда не принадлежала ему). Вы можете создать что-то вроде IsAbleToReceiveCreditSpecification и поместить туда всю логику. Мы можем пойти дальше и объединить спецификации, например: вы можете создать SecureAgeSpecification и AssetsGreaterThanSpecification и использовать их для составления IsAbleToReceiveCreditSpecification.

Поэтому я не думаю, что LINQ заменяет спецификацию. На самом деле это улучшает рисунок. Существуют некоторые реализации спецификации, которые используют LINQ внутри с IQueriable<T>, при этом вы можете использовать спецификацию внутри своих запросов ORM на уровне репозитория/доступа к данным.

person fabriciorissetto    schedule 06.01.2016

Я не знаю LINQ, но мне кажется, что декларативная система запросов в целом связана с шаблоном спецификации. В частности, реализация декларативной системы запросов путем объединения объектов в объектно-ориентированной среде. IIRC похож на то, что делает LINQ, предоставляя слой синтаксического сахара.

Я не могу сказать, полностью ли устаревает LINQ шаблон. Может быть, есть крайние случаи, которые просто нельзя выразить в LINQ?

person Wouter Lievens    schedule 21.09.2009