2015-03-31 120 views
0

我有一個類A實現了接口IA自動實現一個接口來封裝現有的實現

class A : IA 
{ 
    f(){...} 
} 

我想用一個新的類WrapA將實現IA以及包裹A,有意向通過調用其功能每一個作爲一個新的任務包A

class WrapA : IA 
{ 
    private A; 
    f() 
    { 
    StartInNewTask(A.f()); 
    } 
} 

當然,這是很容易做手工。

但我想要一個自動的機制,這個包裝,類似於一個mock用來模擬接口。

如果在我希望看到一個示例之前完成,或者想了解如何實現它,

回答

0

我發現最好的框架是Unity的攔截器。

由於我已經使用Unity Bootstrapper,所以它很容易集成。

https://msdn.microsoft.com/en-us/library/dn178466%28v=pandp.30%29.aspx

實施(簡體,你將需要與返回值小心):

public class RestPerformanceInterceptor : IInterceptionBehavior 
{ 
    public bool WillExecute { get { return true; } } 

    public IEnumerable<Type> GetRequiredInterfaces() 
    { 
     return new[] { typeof(IA) }; 
    } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     var behaviorDelegate = getNext(); 

     StartInNewTask(behaviorDelegate.Invoke(input, getNext)); 

     return new Mock<IMethodReturn>(); 
    } 
} 
1

爲了達到這個目的,你可以使用CodeDOM技術來動態創建代碼。您以面向對象的方式構建您的名稱空間/類。有關詳細文檔,請參閱MSDN CodeDOM

對於您的情況,您需要使用Type.GetMethods-方法來閱讀想要通過反射進行打包的方法。因此,您使用CodeMethodInvokeExpression訪問目標方法。 您需要引用包裝對象,您可以使用CodeVariableReferenceExpression訪問該對象。有了這個,你可以使用CodeMethodInvokeExpression來調用Task.Run() -Method(或任何你使用的),並提供委託和對你的目標對象的引用。

這是一個複雜的話題,所以您需要閱讀一些文檔,但由於它是Microsoft技術,因此它有很好的文檔記錄功能。一旦你讀完了,它將很容易實現你的包裝。