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 SecureAgeSpecification
và AssetsGreaterThanSpecification
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.
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. –