hBifTs

山自高兮水自深!當塵霧消散,唯事實留傳.荣辱不惊, 看庭前花开花落; 去留随意, 望天上云展云舒.
随笔 - 82, 文章 - 27, 评论 - 442, 阅读 - 25万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

DynamicPorxy for .NET

Posted on   hbiftsaa  阅读(4059)  评论(0编辑  收藏  举报

        前一段时间看了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

编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示