據我所知,所有編譯時.NET面向方面編程框架(如PostSharp或Fody)只能處理已成功編譯的代碼。使用編譯時方面來實現抽象接口
這提出了一個障礙,如果你想使用這些框架的一個方面來實現的抽象接口的成員,因爲被修改的類將不執行生成後工序後,直到接口。如果由於缺少界面導致編譯階段失敗,則構建後步驟將無法運行。
例如,編寫一個WPF MVVM應用程序,我有一個抽象接口用於我的視圖模型。接口決定了視圖模型必須執行的命令,例如:
using System.Windows.Input
public interface ITestVM
{
ICommand SomeCommand { get; }
}
我想創建一個具體的實現這個視圖模型抽象接口,使用Commander.Fody實現ICommand的實例。下面是我的嘗試:
using Commander;
public class TestVM : ITestVM
{
[OnCommandCanExecute("SomeCommand")]
private bool SomeCommandCanExecute()
{
return true;
}
[OnCommand("SomeCommand")]
private void SomeCommandExecute()
{
}
}
這將產生「‘ITestVM.SomeCommand’TestVM「不實現接口成員」
我相信Commander.Fody 將創建一個名爲一個ICommand實例錯誤信息一些命令,但它從來沒有機會這樣做。
有什麼辦法可以使用編譯時面向方面的框架來實現抽象接口嗎?我讀過「AOP.NET」這本書,編譯時編織章節中沒有討論這種限制(pp183-190)。
你可以做的是有AOP框架注入整個界面而不只是執行。但是這可能會導致代碼中的其他問題,因爲您可能希望* TestVM執行ITestVM,並且編譯器會抱怨*。 – nvoigt 2015-02-10 19:51:50
即使它沒有實現(在編譯時),也可以將一些對象轉換爲接口。所以你可以通過將TestVM投射到ITestVM來解決這個問題。 – 2015-02-13 07:54:12