2012-08-11 46 views
3

我有一個(也是唯一的)方法,我想使用一個方面。它是IModule.Initialize。 (該方法在大約15個班找到了我的解決方案)從頭創建一個面向方面的屬性/方法

它應該是這樣的:

[LogToSplashScreen] 
public void Initialize() 
{ 
    RegisterViews(); 
    RegisterDesignTimeVMs(); 
} 

我想我的方面的方法體之前運行此執行:

var moduleInfo = new ModuleInformation{ModuleName = "ClassNameHere"}; 
splashScreenService.ModuleLoadStart(moduleInformation); 

這之後:

splashScreenService.ModuleLoadEnd(moduleInformation); 

邊注:
我看着這個,想到了,好的,試試PostSharp。我聽說這是冠軍的AOP工具。所以我激活了NuGet包(希望獲得免費版本)並安裝它。

它被加載DemoWare(即額外的安裝程序)。我個人不介意。但我不希望我的團隊必須處理安裝程序,以便解決我的小問題。

而且,除了演示以外,事實是有一個用戶界面(我猜測)使得我的構建服務器很難。 (我使用軟件包還原。)

這些都是我願意處理的所有事情,如果我要全面介紹面向方面編程(Aspect Oriented Programming)。
但我只需要一個...


有沒有辦法與「推出自己的」出了很多頭疼的?

回答

1

我不會那麼快地註銷PostSharp。您可能想要將您的問題發佈到SharpCrafters forum。你的問題現在是一個小問題,但是如果你遇到其他問題,如果AOP有用,即使數量很少,像PostSharp,Castle DynamicProxy等工具也是必要的。

至於「滾動你自己」,你可以做的是使用裝飾模式。我不確定moduleInformation變量來自哪裏,我打算假設你實際上打算輸入moduleInfo

然後,假設你的界面看起來像:

public interface IModule 
{ 
    void Initialize(); 
} 

而且你〜15類實現IModule的。你想添加一些涉及ModuleInformation的功能,所以創建一個裝飾器類。

public class ModuleDecorator : IModule 
{ 
    IModule _subject; 
    public ModuleDecorator(IModule subject) 
    { 
     _subject = subject; 
    } 

    public void Initialize() 
    { 
     var moduleInfo = new ModuleInformation{ModuleName = "ClassNameHere"}; 
     splashScreenService.ModuleLoadStart(moduleInfo); 

     _subject.Initialize(); 

     splashScreenService.ModuleLoadEnd(moduleInfo); 
    } 
} 

現在,當你想要實例您〜15個班的一個,只是通過裝飾運行它,如:

IModule obj = new ModuleDecorator(new OneOfMy15Classes()); 

當然,使用IoC容器會做出更好的(例如, StructureMap,Ninject,無論你使用什麼)。

裝飾模式的使用幾乎是PostSharp和其他AOP工具在幕後執行的。如果你真的只需要一個接口上的一個裝飾器,我認爲這是一條路:不需要引入AOP工具。但是如果你開始創建基本上做同樣的事情,但對於不同的接口的裝飾器,那可以很快失控,那就是當我帶入一個AOP工具的時候。

編輯:我只注意到「ClassNameHere」,你可以通過反射與_subject.GetType().Name

相關問題