2013-11-23 70 views
9

我有一個類,看起來像這樣:執行方法之後幾種方法運行

public class SomeClass 
{ 
    public void SomeMethod1() { ... } 
    public void SomeMethod2() { ... } 
    public void SomeMethod3() { ... } 

    private void SomeSpecialMethod(SomeParameter) { ... } 
} 

就目前而言,我有各自的前3個方法調用SomeSpecialMethod()只是這些方法返回之前。我要添加大約15個方法,最後都需要執行SomeSpecialMethod(),我想知道是否有方法說「當這個類中的任何方法運行,執行SomeSpecialMethod()而不必明確在每種方法結束時重複呼叫,並且當然阻止SomeSpecialMethod()無限地呼叫自己。

感謝您的建議。

回答

4

您在尋找AOP - 面向方面的編程。

C#不遵循這個範例,但你可以模仿它。 PostSharp是一種選擇,但我會用城堡攔截器/ DynamicProxy代替:http://docs.castleproject.org/Windsor.Interceptors.ashx

您需要創建一個攔截器來環繞對象並攔截對它的調用。在運行時,Castle會使這個攔截器擴展你的具體類或實現一個通用接口 - 這意味着你可以將攔截器注入到目標爲SomeClass的任何代碼塊中。 您的代碼將是這個樣子:

public class Interceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed(); 
     //add your "post execution" calls on the invocation's target 
    } 
} 

編輯

介紹與城堡AOP的:http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx

攔截和AOP在一般情況下,通常使用的東西,如登錄的每個方法調用對象的結果,或者記錄任何方法拋出的每個異常。

如果SomeSpecialMethod內部的邏輯是抽象的並且與SomeClass沒有真正關聯(例如記錄),將邏輯移至攔截器本身可能是有意義的 - 但這取決於您。

+0

好的,謝謝你的回答;我不知道AOP。我現在要離開我的代碼模式,但我會記住你的答案。 – frenchie

1

我也曾經面臨這樣的問題,解決它像這樣:聲明的auxuliary嵌套類(比方說,X)沒有任何字段/方法,只有一個構造函數的SomeClass對象,並調用其SomeSpecialMethod()。隨後進行的所有SomeClass的方法返回X

public X SomeMethod1() { 
    ... 
    return new X(this); 
} 

當然,還有一個開銷,並且可以與非void方法做到這一點(當然,你可以,但它會變得醜陋)。

+1

這比通過每種方法調用事件有什麼優勢?兩者都需要一行(只要您在構造函數中添加處理程序)。 –

+0

@JeroenVannevel自我記錄,我猜?這個'X'類可以被命名爲'GuaranteedToCallSomeSpecialMethodOnReturn'。 –