前一段时间看了JGTM'2004的用透明代理机制实现简单AOP的文章后,受益颇多...但是正如他自己在Blog中所说的那样,使用上述这种方法的局限就是使用的对象必需要从MarshalByRefObject类继承.由于C#没有使用多重继承,所以对于我们自己的程序而言就操作起来不是很方便.
这几天在CodeProject上面发现DynamicProxy的东东,细细看了一下,发现通过这个东东,完全可以取代上述方法,而且对操作的对象没有必需继承自MarshalByRefObject的限制..
使用方法很简单的,看它自带的SecurityProxy.cs,SecurityManager.cs和DynamicProxyTest.cs 这三个文件就可以明白使用的方法...
它的原理是这样的,首先,通过实际对象TestImpl得到它继承自的接口ITest的函数信息,动态生成一个新的类(可以理解为动态生成一个继承自ITest的新类ITestProxy),并HOOK了它所有的函数调用方法,使其所有的函数调用最后转到SecurityProxy类的Invoke方法...这样我们就可以在SecurityProxy类的Invoke中进行类似事务处理的操作...
其函数调用流程如下:(以DynamicProxyTest.cs为例)
ITest test = (ITest)SecurityProxy.NewInstance( new TestImpl() );
得到动态生成的ITestProxy的一个实例,
test.TestFunctionOne()
实际调用的是SecurityProxy类中的Invoke函数,由前面的new TestImpl()语句生成的实际要操作的对象已存于SecurityProxy类中,所以直接调用 retVal = method.Invoke( obj, parameters );方法.在调用此方法已前使用SecurityManager.IsMethodInRole( userRole, method.Name )进行用户权限的检查...
通过这种方法可以很方便的实现类似AOP的机制,,但是这种方法也有不方便操作的地方.由于它是通过得到实际对象的Interface(接口)信息来进行函数调用HOOK的,所有我们要使用的类都得从Interface继承(我不知道这是不是好习惯,Maybe yes,maybe no),否则会出现Case失败的异常.
然后就是不能很方便的自定义那些函数要HOOK,那些不要.现在有一个解决的方法就是在我们自己自定义的SecurityProxy的Invoke方法中进行判断,但是这样做的话就会影响性能......
不过这也是可以修改的,它提供了source....
呵呵,,鱼与熊掌 现在不可兼得哦...~:P