2013-01-15 54 views
1

我需要實現一個複雜的方面,需要能夠引入一個接口,以及幾個切入點。我不知道如何做到這一點。PostSharp方面介紹一個接口和LocationInterception切入點

我的目標是攔截某些類的字段設置器,以便引入一些行爲(通過裝飾字段上的事件處理程序)。我想轉換一些數據,然後引發一個在特定接口上聲明的事件,所以我想將這個接口引入包含這些字段的類。

最簡單的概念是一個容器,它捕獲其子項上的所有事件並將它們轉換爲容器類中的一個外部事件。

所以,我知道如何使用LocationInterceptionAspect引入方法切入點;

public override void OnSetValue(LocationInterceptionArgs args) 
{ 
    // attach event handler to args.Value.SomeEvent, 
} 

還介紹如何通過InstanceLevelAspect引入接口/方法。

但不是如何將2合併爲一個方面。

我不能簡單地在LocationInterceptionAspect中引入一個接口或成員,因爲範圍是位置,而不是包含類型,並且它不會被編譯。

我總是可以將它分成兩個方面,但這意味着每個方面都不會獨立運作,而且我必須確保兩個方面總是一起使用。

回答

1

看來我可以添加一個OnLocationSetValueAdvice(通過屬性)到一個InstanceLevelAspect,並且這個工作。

[IntroduceInterface(typeof(IMyInterface)] 
public class CustomAspect : InstanceLevelAspect 
{ 
    [OnLocationSetValueAdvice] 
    [MulticastPointcut(Targets = MulticastTargets.Field, Attributes = MulticastAttributes.Instance)] 
    public void OnSetValue(LocationInterceptionArgs args) 
    { 
     ... 
    } 
}