您的位置:首页 > 其它

通过代理为对象添加功能

2007-08-27 11:55 260 查看
using System;

using System.Threading;

using System.Runtime.Remoting.Proxies;

using System.Runtime.Remoting.Messaging;

using System.Runtime.Remoting;

namespace ConsoleApplication1

{

public interface ICalculator

{

double Add(double x, double y);

double Multiply(double x, double y);

}

public class PriortyProxy:RealProxy//定义增加优先级的代理类

{

readonly MarshalByRefObject target;

readonly ThreadPriority level;

public PriortyProxy(MarshalByRefObject target, Type type, ThreadPriority level):base(type)

{

this.target = target;

this.level = level;

}

public override IMessage Invoke(IMessage request)

{

IMethodCallMessage call=(IMethodCallMessage)request;

//调整优先级

Thread here = Thread.CurrentThread;

ThreadPriority old = here.Priority;

here.Priority = level;

//转发调用

IMessage response = RemotingServices.ExecuteMessage(target, call);

//回复为旧的优先级

here.Priority = old;

// 将响应消息返回给透明代理

return response;

}

}

public class MyCalc : MarshalByRefObject, ICalculator

{

public static MyCalc Create(ThreadPriority level)//创建插入代理的工厂方法

{

MyCalc target = new MyCalc();

PriortyProxy rp = new PriortyProxy(target, typeof(MyCalc), level);

return (MyCalc)rp.GetTransparentProxy();

}

private MyCalc() { }

public double Add(double x, double y) { return x + y; }

public double Multiply(double x, double y) { return x * y; }

}

class Program

{

static void Main(string[] args)

{

MyCalc c = MyCalc.Create(ThreadPriority.Highest);

Console.WriteLine(c.Add(1.0, 3.34));

Console.WriteLine(c.Multiply(2.0, 3.14));

Console.ReadLine();

}

}

}

上述例子为MyCalc类的方法调用实现线程优先级的调整。将优先级调整代码从MyCalc类中分离了出来,但是这并不是透明的。MyCalc必须些一个工厂方法!也必须使用该方法。不能直接用new来创建MyCalc!

上面的例子来自<<.net本质论>>第七章!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐