2009-09-21 35 views
7

Wikipedia tuyên bố rằng Mô hình đặc điểm là nơi mà logic nghiệp vụ có thể được kết hợp lại bằng cách kết nối logic nghiệp vụ với nhau bằng logic boolean. Đối với việc lựa chọn các đối tượng lọc từ danh sách hoặc bộ sưu tập có vẻ như với tôi rằng Dynamic LINQ cho phép tôi thực hiện điều tương tự. Tui bỏ lỡ điều gì vậy? Có những lợi ích khác cho Mẫu Đặc điểm cũng cần được xem xét không?Mô hình Đặc điểm có lỗi thời khi bạn có thể sử dụng Dynamic LINQ không?


Edit:

Tôi đã tìm thấy một số bài viết mà thảo luận kết hợp LINQ và mẫu Thông số kỹ thuật:

Linq Specifications Project

Implementing the Specification Pattern via Linq by Nicloas Blumhardt (Autofac dude)

Có ai đi làm con đường này và đã làm nó trở nên phức tạp để duy trì?

+0

Tôi đang đối mặt với tình huống chính xác này ngay bây giờ, vì vậy câu hỏi này rất quan tâm đến tôi. –

Trả lời

2

LINQ động sử dụng biểu thức chuỗi để cho phép xây dựng truy vấn động. Vì vậy, chúng tôi làm trong thực tế mất an toàn loại ở đó. Trong khi sử dụng các mẫu bao bọc như kiểu trang trí của nó, thì mô hình đặc tả, cho phép chúng ta duy trì sự an toàn kiểu mã. Tôi khám phá bằng cách sử dụng Mẫu trang trí làm trình bao bọc truy vấn để sử dụng lại và tạo các truy vấn động. Bạn có thể tìm thấy bài viết về dự án mã tại: Linq Query Wrappers

Hoặc bạn có thể kiểm tra blog của mình.

5

Tôi là người phát triển C# và thích sử dụng mẫu đặc điểm kỹ thuật vì nó gần gũi hơn với miền doanh nghiệp của tôi. Hơn nữa, bạn không có bất kỳ bất ngờ với mẫu này, nếu một lớp đặc tả tồn tại, nó sẽ hoạt động. Với Linq, nhà cung cấp cơ bản của bạn có thể đã không triển khai một số tính năng và bạn sẽ không biết nó cho đến khi chạy.

Nhưng dứt khoát, lợi thế lớn nhất của đặc điểm kỹ thuật trên LINQ là gần gũi hơn với doanh nghiệp, đó là một DSL nhỏ. LINQ cho tôi là DSL cho truy vấn thu thập, không phải cho miền doanh nghiệp.

1

Tôi không biết LINQ thực sự, nhưng có vẻ như với tôi rằng một hệ thống truy vấn khai báo nói chung có liên quan đến mẫu đặc tả. Đặc biệt, thực hiện một hệ thống truy vấn khai báo bằng cách soạn các đối tượng với nhau trong một môi trường hướng đối tượng. IIRC giống như những gì LINQ làm, cung cấp một lớp đường cú pháp.

Cho dù LINQ có hoàn toàn lỗi thời với mẫu không, tôi không thể nói. Có lẽ có những trường hợp góc mà không thể được thể hiện trong LINQ?

0

LINQ:

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

Thông số kỹ thuật:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList(); 
  • Logic kinh doanh là encapsuled trong đặc tả (với một tên tiết lộ nó là gì).
  • DRY: bạn không lặp lại LINQ rằng trong mã, bạn chỉ cần sử dụng kỹ thuật

Tôi thích sử dụng đặc điểm kỹ thuật khi tôi nghĩ rằng sự cai trị là đủ quan trọng để được rõ ràng trong các mã NHƯNG nó không thuộc về tổ chức.

Ví dụ:

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; 
    } 
} 

Có từ Customer các Trách nhiệm để quyết định xem ông có thể nhận được một số tín dụng?

Có thể là không.

Vì vậy, với đặc điểm kỹ thuật, bạn có thể xóa logic đó khỏi Customer (nó không bao giờ thuộc về nó). Bạn có thể tạo một cái gì đó như IsAbleToReceiveCreditSpecification và đặt tất cả logic ở đó. Chúng tôi có thể đi xa hơn và kết hợp các đặc điểm kỹ thuật, ví dụ: bạn có thể tạo một SecureAgeSpecificationAssetsGreaterThanSpecification và sử dụng chúng để soạn IsAbleToReceiveCreditSpecification.

Vì vậy, tôi không nghĩ LINQ thay thế Đặc điểm kỹ thuật. Trong thực tế, nó cải thiện mô hình. Có một số triển khai đặc tả sử dụng LINQ nội bộ với IQueriable<T>, với điều này bạn có thể sử dụng đặc tả bên trong các truy vấn ORM của bạn trên cấp độ Repository/DataAcess.

Các vấn đề liên quan