开源一个组件, 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

posted on 2011-11-28 10:42  听说读写  阅读(2325)  评论(11编辑  收藏  举报

导航