WCF 双工服务失去与客户端的耦合

本文关键字:客户端 耦合 失去 服务 WCF | 更新日期: 2023-09-27 18:31:13

我已经在一个问题上停留了 2 周。

假设我们有一个双工 WCF 服务和一个调用该服务的客户端应用程序。

该应用程序具有由服务组成的类MyCallBackClass。我想实现的是将实例化服务传递给 MyCallBackClass 客户端应用程序的构造函数(失去耦合)。所以它看起来像一个方法的服务和一个方法的回调:

双工服务合同:

[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(ICallback))]
public interface IService{
 [OperationContract(IsOneWay = true)]
 void GetDataFromService();
}

双工回调:

public interface ICallback{
[OperationContract(IsOneWay = true)]
void ReceiveMessage(string message);
}

双工服务实施

public class Service : IService{
//... here a reference to the Callback endpoint
void GetDataFromService(){
callBackEndPoint.ReceiveMessage("Service was called.");
}
}

实现回调的类:

public class MyCallBackClass : ICallback, Widnows.Form
{
IService service;
public MyCallBackClass (){
InstanceContext instanceContext = new InstanceContext(this);
this.service = new ServiceClient(instanceContext);
}
public ReceiveMessage(string message){
this.textBoxMessage.Text = message;
//here I want to stress that I would like my CallBack object to be a Form or WPF Form
//so that I can react on callbacks by modyfing the Controls like TextBox, ListBox directly
}
}

现在在应用程序中,我被迫在实现回调接口的对象的构造函数中实例化服务,让我们假设它是一个窗体或 WPF 窗体(如下所示):

public void Main(string[] args){
MyCallBackClass myWindow = new MyCallBackClass();
myWindow.GetDataFromService();
}

我想要的是将服务传递到回调处理程序的构造函数中,如下所示:

public void Main(string[] args){
Iservice service = new ServiceClient();// but what about the InstanceContext that is the MyCallBackClass object...???
MyCallBackClass myWindow = new MyCallBackClass(service);
myWindow.GetDataFromService();
}

当然,类的 MyCallBackClass 构造函数会更改为:

public class MyCallBackClass : ICallback, Widnows.Form
{
IService service;
public MyCallBackClass (IService _service){
InstanceContext instanceContext = new InstanceContext(this);
this.service = _service;
...
}

这样我就可以将实现 IService 接口的任何类型的服务注入到客户端类,并且通过模拟服务来测试客户端类很容易。不幸的是,我遇到了一个依赖循环。InstanceContext dependson MyCallBackClass that dependson IService that dependson InstanceContext...

您能否尝试理解并尝试引导我找到解决此问题的任何方向?

WCF 双工服务失去与客户端的耦合

你可以试试这个。 win.service.value是第一次使用服务的时间,它将被实例化(引用原始委托)。这也可以使用Windows上的方法SetService来完成,不同之处在于有人可能会忘记在创建Windows实例时调用它。所有必需项都必须在Windows的构造函数中,即协定,函数以及延迟加载使您的依赖项:)

你绝对应该重构你的代码,尝试阅读SOLID原则。

public class Service
{
    private int number;
    private Window win;
    public Service(int num, Window win)
    {
        number = num;
        this.win = win;
    }
}
public class Window
{
    public Lazy<Service> service;
    public Window(Func<Service> getService)
    {
        service = new Lazy<Service>(getService);
    }
}

    static void Main(string[] args)
    {
        Service  s = null;
        var win = new Window(() => s);
        s = new Service(1, win);
        Service winS = win.service.Value;
    }