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