Dynamic LINQ를 사용할 수 있으면 사양 패턴이 더 이상 사용되지 않습니까?

StackOverflow https://stackoverflow.com/questions/1454049

문제

위키피디아 사양 패턴은 부울 논리를 사용하여 비즈니스 논리를 함께 연결하여 비즈니스 논리를 재조합할 수 있는 곳임을 나타냅니다.목록이나 컬렉션에서 필터링 개체를 선택하는 것과 관련하여 Dynamic LINQ를 사용하면 동일한 작업을 수행할 수 있는 것 같습니다.뭔가 빠졌나요?고려해야 할 사양 패턴의 다른 이점도 있습니까?


편집하다:

LINQ와 사양 패턴의 결합을 논의하는 게시물을 찾았습니다.

Linq 사양 프로젝트

Nicloas Blumhardt의 Linq를 통한 사양 패턴 구현(Autofac 친구)

이 길을 따라가서 유지 관리가 복잡해진 사람이 있나요?

도움이 되었습니까?

해결책

동적 LINQ는 문자열 식을 사용하여 동적 쿼리 구성을 허용합니다.그래서 우리는 실제로 거기에서 유형 안전성을 잃습니다.밀접하게 관련된 구현의 데코레이터 패턴과 같은 래퍼 패턴을 사용하는 반면 사양 패턴을 사용하면 코드에서 유형 안전성을 유지할 수 있습니다.쿼리를 재사용하고 동적으로 작성하기 위해 데코레이터 패턴을 쿼리 래퍼로 사용하는 방법을 살펴봅니다.다음에서 코드 프로젝트에 대한 기사를 찾을 수 있습니다.Linq 쿼리 래퍼

아니면 내 것을 확인해도 돼 블로그.

다른 팁

저는 C# 개발자이고 사양 패턴을 사용하는 것을 좋아합니다. 사양 패턴이 내 비즈니스 영역에 더 가깝기 때문입니다.게다가 이 패턴은 놀랄 일이 아닙니다. 사양 클래스가 존재한다면 작동할 것입니다.Linq를 사용하면 기본 공급자가 일부 기능을 구현하지 않았을 수 있으며 런타임까지 이를 알 수 없습니다.

그러나 결정적으로 Linq에 비해 사양의 가장 큰 장점은 비즈니스에 더 가깝다는 것입니다. 바로 미니 DSL입니다.나에게 LINQ는 비즈니스 도메인이 아닌 컬렉션 쿼리를 위한 DSL입니다.

저는 LINQ를 잘 모르지만 일반적으로 선언적 쿼리 시스템은 사양 패턴과 관련이 있는 것 같습니다.특히, 객체 지향 환경에서 객체를 함께 구성하여 선언적 쿼리 시스템을 구현합니다.IIRC는 LINQ의 기능과 유사하며 구문 설탕 계층을 제공합니다.

LINQ가 패턴을 완전히 폐기했는지 여부는 알 수 없습니다.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>, 이를 통해 Repository/DataAcess 수준의 ORM 쿼리 내부 사양을 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top