2012-10-29 40 views
12

我創建了一個自定義屬性類,該類將檢查系統安全性並在出現安全錯誤時引發身份驗證異常。將具有變量值的自定義屬性作爲參數傳遞

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

我想用這個自定義屬性的聲明實體相加功能,我想從功能屬性的構造函數傳遞變量。可以這樣做嗎?

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

我在想究竟做同樣的事情,以確保我的服務層 –

回答

12

可以這樣做嗎?

否。屬性中的構造函數參數必須在編譯時上解析。它們旨在作爲類型或方法本身的元數據,而不是每個調用或每個實例都會使用的元數據。

根據您的描述,某個屬性可能不是處理此問題的適當方式。既然你想運行每次調用發生的額外代碼,你將需要一種不同的技術。例如,你可以傳遞一個委託,即:

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

這將讓那麼你通過調用類似:

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

首先感謝你這麼多你的迴應,所以我怎麼能做到同樣的邏輯,我希望有一個安全檢查直接做之前該功能被稱爲?! –

+0

@SamirAdel我提供了另一種替代方法。 –

+0

非常感謝你的幫助。 –

1

在這種情況下,我建議看着面向方面編程。這是一種執行代碼的不同方式,但它允許您在整個過程中重新使用樣板邏輯(例如,身份驗證)。你可能需要設計屬性有點不同,但是所有的邏輯都可以放入一個「方面」,然後在構建項目時自動編譯到代碼中。

我個人使用PostSharp,雖然我知道那裏有其他人。他們有一個可用於開發的免費許可證;只要您不需要高級功能,它就非常具有成本效益。

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

+0

fyi你的鏈接已經死了! –

+0

謝謝@JustinL。 - 任何人都可以編輯SO上的帖子。我已經更新了這個版本,但可以隨時提供更多的評論:) – theMayer

相關問題