锁定老帖子 主题:.Net动态代理
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-02-04
jjx 写道 mig15 写道 比如:要对一个对象的操作进行权限控制,在转发请求前进行权限判断。
问题是:代理会对所有的调用(象GetType(),ToString()...)都进行权限判断,而这些调用是不用权限控制的(应该直接转发)。可以用methodName和字符串比较来解决,但这样做不优雅,不爽... 动态代理代理的是接口,又不是方法,难道java的dynamicproxy不是如此吗?请说明 如果你自己不想做,用aop不就完了吗。像spring.net aop,aspectsharp都可以完成这种事情 java的dynamicproxy也是一样的,用代理使一个对象拥有日志记录的功能,那么toString(),equals()这些调用也会被记录到日志里 |
|
返回顶楼 | |
发表时间:2005-02-04
mig15 写道 比如:要对一个对象的操作进行权限控制,在转发请求前进行权限判断。
问题是:代理会对所有的调用(象GetType(),ToString()...)都进行权限判断,而这些调用是不用权限控制的(应该直接转发)。可以用methodName和字符串比较来解决,但这样做不优雅,不爽... 看来是老夫老朽了,还是不明白你的问题是什么。嘿嘿 |
|
返回顶楼 | |
发表时间:2005-02-04
mig15 写道 比如:要对一个对象的操作进行权限控制,在转发请求前进行权限判断。
问题是:代理会对所有的调用(象GetType(),ToString()...)都进行权限判断,而这些调用是不用权限控制的(应该直接转发)。可以用methodName和字符串比较来解决,但这样做不优雅,不爽... 当然是用attributele来做,比如 [AttributeUsage(AttributeTargets.Method, Inherited=true)] public abstract class ValidatorAttribute : Attribute { public abstract void Validate(object value); } [AttributeUsage(AttributeTargets.Method, Inherited=true)] public sealed class SecurityValidatorAttribute : ValidatorAttribute { public bool CheckRights { get { return _checkrights; } set { _checkrights= value; } } .. public override void Validate(object value); ... } 在class 可以 [SecurityValidator(CheckRights =false)] public string GetType{..} [SecurityValidator(CheckRights =true)] public string Execute{..} |
|
返回顶楼 | |
发表时间:2005-02-04
用java的语法吧,.Net的比较繁琐,您老看看:
public Object invoke(Object proxy, Method method, Object[] args); throws Throwable { Object result = null; try { if(method.getName();.equals("toString"););{ return super.toString();; } if(method.getName();.equals("hashCode"););{ return super.hashCode();; } //... //do before... result = method.invoke(delegate,args);; //do after... } ... 这里对toString(),hashCode()作了特殊处理 |
|
返回顶楼 | |
发表时间:2005-02-04
mig15 写道 用java的语法吧,.Net的比较繁琐,您老看看:
public Object invoke(Object proxy, Method method, Object[] args); throws Throwable { Object result = null; try { if(method.getName();.equals("toString"););{ return super.toString();; } if(method.getName();.equals("hashCode"););{ return super.hashCode();; } //... //do before... result = method.invoke(delegate,args);; //do after... } ... 这里对toString(),hashCode()作了特殊处理 为什么要在Remoting的对象上调用这些方法呢?能告诉我在什么情况下需要这些调用吗? 我的理解是: Remoting的客户端能够唯一知道的就是Facade的接口。 里面都是业务相关的服务接口。 |
|
返回顶楼 | |
发表时间:2005-02-04
我的理解是:
Remoting的客户端能够唯一知道的就是Facade的接口。 里面都是业务相关的服务接口。 ================================= 但你不能阻止客户端调用这些方法,而且这些方法有时是不用显式调用的(如hashCode(),toString()), 任其自由的话,很危险... |
|
返回顶楼 | |
发表时间:2005-02-04
mig15 写道 我的理解是:
Remoting的客户端能够唯一知道的就是Facade的接口。 里面都是业务相关的服务接口。 ================================= 但你不能阻止客户端调用这些方法,而且这些方法有时是不用显式调用的(如hashCode(),toString()), 任其自由的话,很危险... 有什么危险?会引发洪水?! ![]() |
|
返回顶楼 | |
发表时间:2005-02-04
处理不好,是有可能引发堆栈溢出
|
|
返回顶楼 | |
发表时间:2005-02-04
mig15 写道 处理不好,是有可能引发堆栈溢出
赫赫,随便写个递归调用方法,堆栈一样溢出。 干嘛要跟自己过不去? ![]() |
|
返回顶楼 | |
发表时间:2005-04-06
partech 写道 mig15 写道 partech 写道 mig15 写道 尝试了.Net的动态代理,用RealProxy实现
问题是被代理的领域对象要从MarshalByRefObject继承,头痛... 还有一种方法也要求领域对象从ContextBoundObject继承,头痛,头痛... 赫赫,活该 ![]() 或许应该在facade对象上应用动态代理,对不对? 恩,孺子可教也 但如果facade上都是些static方法呢?怎么代理 |
|
返回顶楼 | |