论坛首页 编程语言技术论坛

.Net动态代理

浏览 18141 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-02-04  
jjx 写道
mig15 写道
比如:要对一个对象的操作进行权限控制,在转发请求前进行权限判断。
问题是:代理会对所有的调用(象GetType(),ToString()...)都进行权限判断,而这些调用是不用权限控制的(应该直接转发)。可以用methodName和字符串比较来解决,但这样做不优雅,不爽...


动态代理代理的是接口,又不是方法,难道java的dynamicproxy不是如此吗?请说明

如果你自己不想做,用aop不就完了吗。像spring.net aop,aspectsharp都可以完成这种事情


java的dynamicproxy也是一样的,用代理使一个对象拥有日志记录的功能,那么toString(),equals()这些调用也会被记录到日志里
0 请登录后投票
   发表时间:2005-02-04  
mig15 写道
比如:要对一个对象的操作进行权限控制,在转发请求前进行权限判断。
问题是:代理会对所有的调用(象GetType(),ToString()...)都进行权限判断,而这些调用是不用权限控制的(应该直接转发)。可以用methodName和字符串比较来解决,但这样做不优雅,不爽...


看来是老夫老朽了,还是不明白你的问题是什么。嘿嘿
0 请登录后投票
   发表时间: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{..}
0 请登录后投票
   发表时间: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()作了特殊处理
0 请登录后投票
   发表时间: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的接口。
里面都是业务相关的服务接口。
0 请登录后投票
   发表时间:2005-02-04  
我的理解是:
Remoting的客户端能够唯一知道的就是Facade的接口。
里面都是业务相关的服务接口。

=================================
但你不能阻止客户端调用这些方法,而且这些方法有时是不用显式调用的(如hashCode(),toString()),
任其自由的话,很危险...
0 请登录后投票
   发表时间:2005-02-04  
mig15 写道
我的理解是:
Remoting的客户端能够唯一知道的就是Facade的接口。
里面都是业务相关的服务接口。

=================================
但你不能阻止客户端调用这些方法,而且这些方法有时是不用显式调用的(如hashCode(),toString()),
任其自由的话,很危险...


有什么危险?会引发洪水?!
0 请登录后投票
   发表时间:2005-02-04  
处理不好,是有可能引发堆栈溢出
0 请登录后投票
   发表时间:2005-02-04  
mig15 写道
处理不好,是有可能引发堆栈溢出

赫赫,随便写个递归调用方法,堆栈一样溢出。
干嘛要跟自己过不去?
0 请登录后投票
   发表时间:2005-04-06  
partech 写道
mig15 写道
partech 写道
mig15 写道
尝试了.Net的动态代理,用RealProxy实现
问题是被代理的领域对象要从MarshalByRefObject继承,头痛...


还有一种方法也要求领域对象从ContextBoundObject继承,头痛,头痛...


赫赫,活该 谁让你把领域对象传来传去了。


或许应该在facade对象上应用动态代理,对不对?

恩,孺子可教也


但如果facade上都是些static方法呢?怎么代理
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics