2014-05-01 26 views
0

我繼承了一個用WinForms編寫的大項目,我必須進行很多小的修改。我想使用AOP(Castle.DynamicProxy和Autofac),迄今爲止還沒有造成我的問題。我寫了一個簡單的看點:如何將方面添加到WinForms中的方法?

class TestAspect : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     Console.WriteLine("Satrt method" + invocation.Method.Name); 
     invocation.Proceed(); 
     Console.WriteLine("Stop funkcji " + invocation.Method.Name); 
    } 
} 

接下來,我在ContainerBuilder中註冊類型。例如:

builder.RegisterType<SomeClass>().As<ISome>().EnableInterfaceInterceptors().InterceptedBy(typeof(TestAspect)); 
builder.RegisterType<TestAspect>(); 

到目前爲止,這麼好。但是我必須將這個方面添加到遺留代碼(寫得不好)。我不得不明確地將方面代碼(不僅如上所述)添加到WinForms。例如,我有啓動CalculateSomething方法的按鈕(在當前Window中不在類中)。在ContainerBuilder我註冊當前形式:

builder.RegisterType<Form1>().EnableClassInterceptors().InterceptedBy(typeof(TestAspect)); 

但EnableClassInterceptors()僅適用於虛方法。 我知道舊代碼需要重構,但客戶已經使用此程序。 我們重寫了這段代碼,但我們需要快速做一些修改。只要

  1. 使所有的方法爲虛擬(非常糟糕的解決方案)
  2. 手動添加這方面的代碼,每個方法(更糟糕的解決方案)

當然,: 我有兩個解決方案我們重構滯後代碼,我們做對了。但現在呢? 也許有人有什麼想法?

回答

1

Castle DynamicProxy受.NET多態特性的限制。這意味着接口代理實際上是實現類的修飾器,或者代表實現類的子類並覆蓋虛擬方法的類代理。

另一種選擇是將編輯後的行爲添加到IL中。這最終會看起來像你的第二個建議,除了它是由程序而不是程序員完成的。看看http://www.postsharp.net/

+0

非常感謝。它工作正常。 – wopi

相關問題