前一段时间看了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
分类:
AOP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix