2012-10-29 35 views
12

Tôi đã tạo một lớp thuộc tính tùy chỉnh sẽ kiểm tra bảo mật hệ thống và ném ngoại lệ xác thực nếu có lỗi bảo mật.Truyền thuộc tính tùy chỉnh với giá trị biến là tham số

public class EntityChecker: System.Attribute 
{ 
    public EntityChecker(int entityId) 
    { 
     // doing some logic to check if the entityId is allowed to be inserted 
    } 
} 

Tôi muốn sử dụng thuộc tính tùy chỉnh này làm tuyên bố cho chức năng bổ sung thực thể và tôi muốn chuyển một biến từ hàm này sang hàm tạo thuộc tính. có thể một cái gì đó như thế này được thực hiện?

[EntityChecker(entityId)] 
public int AddNewEntity(entityId) 
{ 
// logic of entity addition 
} 
+0

tôi đã nghĩ đến việc làm chính xác những điều tương tự để bảo đảm lớp dịch vụ của tôi –

Trả lời

12

Có thể làm như thế này được thực hiện?!

No. Các tham số trong thông số phải được giải quyết tại thời điểm biên dịch. Chúng được dự định là siêu dữ liệu trên loại hoặc phương pháp chính nó, không phải là thông tin được sử dụng cho mỗi cuộc gọi hoặc từng trường hợp.

Với mô tả của bạn, thuộc tính có thể không phải là cách thích hợp để xử lý việc này. Vì bạn muốn chạy thêm mã xảy ra cho mỗi cuộc gọi, bạn sẽ cần một kỹ thuật khác. Ví dụ, bạn có thể vượt qua một đại biểu, ví dụ:

public int CheckedAddEntity(int entityId, Func<int, int> funcToAdd) 
{ 
    // Perform your checking on entityId here 
    return funcToAdd(); 
} 

này sẽ cho phép thì bạn gọi qua một cái gì đó như:

int result = CheckedAddEntity(entityId, AddNewEntity); 
+0

đầu tiên cảm ơn bạn rất nhiều vì đã trả lời của bạn vậy làm thế nào tôi có thể làm cùng một logic, tôi muốn kiểm tra an ninh được thực hiện trực tiếp trước chức năng được gọi là?! –

+0

@SamirAdel Tôi đã cung cấp một cách tiếp cận thay thế khác. –

+0

cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. –

1

Trong trường hợp này, tôi khuyên bạn nên nhìn vào lập trình Aspect-Oriented. Đó là một cách khác để làm mã, nhưng một cách cho phép bạn sử dụng lại logic bản mẫu (ví dụ: xác thực) trong suốt. Bạn có thể phải thiết kế thuộc tính của bạn một chút khác nhau, nhưng tất cả các logic có thể được đưa vào một "khía cạnh" mà sau đó được biên dịch tự động vào mã khi bạn xây dựng dự án.

Cá nhân tôi sử dụng PostSharp, mặc dù tôi biết có những người khác ở ngoài đó. Họ có giấy phép miễn phí để phát triển; miễn là bạn không yêu cầu chức năng nâng cao, nó rất hiệu quả về chi phí.

http://www.postsharp.net/blog/post/5-Ways-That-Postsharp-Can-SOLIDify-Your-Code-Authorization

+0

fyi liên kết của bạn đã chết! –

+0

Cảm ơn @JustinL. - FYI ai cũng có thể sửa bài viết trên SO. Tôi đã cập nhật cái này, nhưng cảm thấy tự do để đóng góp nhiều hơn một bình luận trong tương lai :) – theMayer

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