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

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


Edit:

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

Linq Технические характеристики проекта

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

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

Ответы [ 4 ]

5 голосов
/ 21 сентября 2009

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

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

2 голосов
/ 15 июля 2010

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

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

1 голос
/ 06 января 2016

LINQ:

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

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

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
  • Бизнес-логика инкапсулирована в спецификации (с именем, раскрывающим, что это такое).
  • DRY : вы не повторяете этот 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 на уровне Repository / DataAcess.

1 голос
/ 21 сентября 2009

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

Неужели LINQ полностью устарел? Может быть, есть угловые случаи, которые просто не могут быть выражены в LINQ?

...