2009-08-20 38 views
0

基本上我試圖在C#中實現某種窮人的面向方面編程。我曾考慮過使用ContextAttribute,但他們似乎只能在課堂上進行綁定。有沒有什麼辦法可以將一個屬性放在一個屬性中,以便它可以接收與它所註釋的方法相同的參數,或者以某種方式訪問​​它所觸發的上下文?在C#中獲得屬性上下文

我有這樣的代碼

public void AddUser(User user) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(user); 
    if (errors.Any()) 
      throw new RulesException(errors); 
    users.Add(user); 
} 

從中我想提取的第3行,所以我有這樣的事情

[Validated] 
public void AddUser(User user) 
{ 
    users.Add(user); 
} 

回答

2

我想你錯過了第三個組件。大多數AOP實現(例如Aspect#)依靠代理或攔截器來實際執行代碼。在你的場景中,你缺少需要的組件1)知道屬性存在於方法上,2)觸發在屬性中執行代碼所需的機制(或成爲它)。

幸運的是,在開源中已經有很多(相當)簡單的解決方案。我能想到的最簡單的選擇是使用編譯時編織器,如PostSharp。拿一份那樣的樣本,在樣本中,你會發現幾個你想要做的事情的例子(你會對OnMethodInvocationAspect感興趣)。

最終的結果是您的代碼看起來與您提供的示例完全相同,但它也運行您希望的代碼。

+0

+1適用於PostSharp – 2009-08-20 21:27:35

+0

這是完美的,我沒有意識到有一個C#方面的編織器在某處讀取了它是不可能的。我想postsharp從http://zombo.com出來,那裏不可能是可能的。 – stimms 2009-08-21 04:03:19

+0

只是FYI,看看Postsharp附帶的插件。我知道log4postsharp(它與log4net和postsharp結婚)是以Log []屬性的形式出現的,它將記錄入口/出口到一個方法(包括反射所有傳入的參數(及其值!))。你可以重寫那些代碼來做任何你想要的驗證。它肯定會爲你節省一些時間... – 2009-08-21 22:06:14

1

不知道你的解決方案應該究竟如何的樣子,但在C#屬性中,只要你不請求它們,就不會執行代碼(據我所知)。如果你查詢屬性,你也有上下文。所以在我看來,你的策略出了問題。