【问题标题】:Using Interface via WCF and directly通过 WCF 直接使用接口
【发布时间】:2013-12-03 11:05:15
【问题描述】:

我有一个实现给定接口的业务层,有一个没有实现的 WCF 服务,只是将接口用作合同。它路由到 BL 具体类:

BL 层

public interface IClass1
{
    List<int> GetData();
}

public class Class1 : IClass1
{
    public List<int> GetData()
    {
        //...
    }
}

WCF 服务

<%@ ServiceHost Language="C#" Debug="true" Service="BusinessLayer.Class1" %>
<%@ Assembly Name="BusinessLayer" %>

在我的客户端,我有一个 MVVM Prism 模块,其中包含一个实现 IClass1 的服务类。这个想法是,我可以构建包含服务模块(通过服务与数据库通信)或直接包含 BL 项目(在这种情况下它将直接与数据库通信)的解决方案。

这似乎工作得很好,但我想在我的应用程序中启用异步等待。通常我只是使用&lt;method&gt;Async 调用来调用WCF Service 方法,然后让它传回Task。但是我在执行此操作时遇到错误,基本上是告诉我在使用 await 时我的服务模块实现需要返回 Task&lt;List&lt;int&gt;&gt;

因为BL、服务层和服务模块之间只有一个接口,这意味着修改接口本身以返回任务,但我宁愿WCF服务能够返回List&lt;int&gt; (同步调用时)或 Task&lt;List&lt;int&gt;&gt; 通过 Async 方法调用时。

有没有什么方法可以在没有单独的 WCF 服务接口的情况下实现这一点?

【问题讨论】:

    标签: c# wcf mvvm prism async-await


    【解决方案1】:

    WCF 服务器的“异步性”完全独立于其客户端代理。

    所以,我认为改变界面是正确的做法。

    • IClass1.GetDataAsync 将返回 Task&lt;List&lt;int&gt;&gt;
    • WCF 服务实现将返回 Task&lt;List&lt;int&gt;&gt;,并且可能是 async
    • 重新创建您的 WCF 代理。这将在代理上创建 Task&lt;List&lt;int&gt;&gt; GetDataAsync()List&lt;int&gt; GetData()

    【讨论】:

    • 我假设在第一点你的意思是IClass1.GetData 会返回Task&lt;List&lt;int&gt;&gt;,而不是GetDataAsync。老实说,这让我困惑了一段时间,但刚刚做到了。我发现即使 GetData 返回一个任务,它的 WCF 实现也会剥离任务 - 然后像往常一样创建一个 GetDataAsync 任务来管理任务返回。
    • 我会在界面上把GetData的名字改成GetDataAsync;这是pattern for Task-returning methods。 WCF 代理将同时创建 GetDataGetDataAsync
    • 公平点。那我就这么做。老实说,没有意识到 WCF 会朝任何一个方向这样做。很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多