我们大多数的应用场景都是客户端传入参数,获得服务端的处理结果。但如果是用wcf做通信管道使用,可能会有这样的场景:客户端发来的数据,要在服务端界面上显示。
典型的代码是这样的:
public Window1() { InitializeComponent(); serviceHost = new ServiceHost(typeof (Service1)); serviceHost.Open(); }
此时,没有办法从host访问内部的Service1。不能拿到Service1的实例,就不能在window1中订阅Service1的事件。
为了关联Service1实例和window1实例,只好使用静态的全局变量。通过ServiceAccessProxy关联两个实例。
public sealed class ServiceAccessProxy { private static List<ISubscriber> subscribers=new List<ISubscriber>(); public static void Subscribe(ISubscriber subscriber) { if(subscriber!=null)subscribers.Add(subscriber); } public static void AddDicom(string dicomFile) { foreach (ISubscriber subscriber in subscribers) { subscriber.DealDicom(dicomFile); } } } public interface ISubscriber { void DealDicom(string dicomFile); }
在service1中传递数据
public void FeedImage(string dicomFile) { ServiceAccessProxy.AddDicom(dicomFile); }
在window1中订阅
public partial class Window1 : Window, ISubscriber { private ServiceHost serviceHost; public Window1() { InitializeComponent(); serviceHost = new ServiceHost(typeof (Service1)); serviceHost.Open(); ServiceAccessProxy.Subscribe(this); } public void DealDicom(string dicomFile) { tb1.Text = dicomFile; } }