Đôi khi, tôi sử dụng các thuộc tính để trang trí các lớp hoặc phương pháp và sử dụng sự phản chiếu để có được dữ liệu 'được phân bổ'.
Có thể hơi khó giải thích, nhưng điều cuối cùng mà tôi đã sử dụng thuộc tính, nằm trong một hệ thống mà tôi có một vài thực thể trong cơ sở dữ liệu.
Mỗi thực thể có một số loại 'mã', và mỗi thực thể cũng có thể có một số quy tắc thông dịch.
Trong dự án của tôi, tôi có một lớp thực thể, đại diện cho một thực thể tồn tại trong Cơ sở dữ liệu, và tôi cũng có một bộ các lớp 'Quy tắc'. Một lớp Quy tắc chứa logic giải thích của một thực thể cụ thể.
Để 'liên kết' một 'Quy tắc' nhất định (diễn giải) với một trường hợp cụ thể của pháp nhân của tôi, tôi đã tạo Thuộc tính tùy chỉnh.
Tôi trang trí lớp 'Quy tắc' của mình với thuộc tính này và thông qua thuộc tính, tôi xác định đối tượng nào là Quy tắc. Sau đó, khi tôi tải một thực thể từ DB, tôi tiêm đúng quy tắc vào thực thể đó.
Một chút code để làm cho mọi việc rõ ràng:
public class MyEntity
{
public string Code
{
get;
private set;
}
public bool IsValidFor(...)
{
IRule rule = RuleRegistry.GetRuleFor(this);
if(rule.IsValid()) ...
}
}
[RuleAttrib("100")]
public class MyRule : IRule
{
public bool IsValid()
{
}
}
Đây chỉ là một ví dụ nhỏ, nhưng tôi nghĩ rằng bạn sẽ bắt trôi dạt.
Thuộc tính RuleAttrib trên lớp MyRule, nói rằng đây là Quy tắc nên được áp dụng cho phiên bản MyClass có mã "100".
Ví dụ RuleRegistry có thể truy xuất IRule chính xác cho thực thể hiện tại (sử dụng phản chiếu).
Một ví dụ khác ở nơi mà tôi đã thuộc tính được sử dụng, kết hợp với PostSharp, là việc thực hiện một hệ thống 'khóa': http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html
Darn, bạn đánh bại tôi với nó! –
+1 cho PrincipalPermissionAttribute - Tôi không thể tin rằng tôi đã làm điều này bằng tay trước đây. – Botz3000