開源一個組件, Clover.Proxy, 請大家指正
Clover.Proxy是一個基于.net 4.0的類庫,
項目地址:https://github.com/xwj90/Clover.Proxy (MIT,隨便使用)
它提供一種簡單的方式代理執行現有類庫里面的方法和屬性,它可以用于以下情況:
1. 對現有類的方法和屬性,增加BeforeCall 和AfterCall
- 通過賦值delegate的方式很方便的自定義BeforeCall 和AfterCall
- 在BeforeCall 和AfterCall中可以執行記錄日志,分析參數,修改參數,記錄每個方法的調用次數等. (可以通過配置的方式,打開或者關閉功能,如此就能較為方便的調試了)
- 通過配置的方式,很方便的控制影響范圍
- 通過修改自動生成的代碼,可以做的更多,例如對某些方法自動加LOG, 在執行過程中修改變量等
2. Proxy支持將現有方法遷移到不同的AppDomain中執行 (主要功能完成)
- 可以控制獨立AppDomain的性能和資源消耗
- 跨AppDomain操作有很強的獨立性,可以擴展為自動更新和重啟 (插件形式,需要開發)
- 由于每個AppDomain支持自己的Configuration File,所以通過給不同的類和assembly配置不同的配置文件,我們可以修改很多現有類庫的行為
- 例如現有項目使用日志系統,不過整個項目的日志都要寫到一個文件里面,通過不同的配置文件,我們可以讓不同的類或者不同的程序集寫入不同的日志文件
- 跨域會有性能損失
3.該項目更像是一個研究性質的項目,其中涉及到了以下的技術: (如果你有興趣,看看源碼)
- 動態生成cs文件和編譯成Assembly
- 分析Type相關信息
- 類繼承的相關知識
- 動態創建AppDomain和加載Assembly
- 跨域操作的相關內容
以下是一個Sample:
ProxyService service = new ProxyService();
service.BeforeCall = (p) =>
{
Console.WriteLine("Before Call : " + p.Arguments);
};
service.AfterCall = (p) =>
{
Console.WriteLine("After Call : " + p.ReturnValue);
};
var item = service.Create<TestWrapper>();
// method
var r1 = item.GetAll(128, "Test String");
Console.WriteLine();
// property 可以通過配置設置某個方法,或者某類方法需要調用BeforeCall & AfterCall
var r2 = item.Name;
Console.WriteLine();
var item2 = service.Create<TestWrapper2>();
var r3 = item2.Test("test string"); //run method in remote domain //未完全完成
感謝 shiweichuan 和 weikaishio
浙公網安備 33010602011771號