0

我是新手,但是阅读了一些关于 wcf 的文章后我才知道,如果我改变了,ServcieContrcat那么我不仅要改变服务端,还要改变客户端端,这真的很难管理。

Example 1:

开发人员必须为订单处理创建 WCF 服务,具有以下功能:GetOrderById, GetOrdersByStatus, SaveOrder

ServiceContract 可能如下所示

[ServiceContract]
public interface IOrderService
{
    [OperationContract]
    Order GetOrderById(int orderId);

    [OperationContract]
    List<Order> GetOrdersByStatus(OrderStatus orderStatus);

    [OperationContract]
    void SaveOrder(Order order)
} 

几个月后,例如,项目经理说:好的,我们的客户需要另一个功能:DeleteOrderById, GetOrdersByCustomerId不再需要GetOrdersByStatus,我们需要GetOrdersByStatusAndCustomerId

开发人员必须更新ServiceContrcat和更新客户端。如您所见,任何更改ServiceContrcat都非常困难

所以我正在寻找如何开发 wcf 服务的最佳指导,如果我们扩展功能或任何类型的更改,这不会产生任何问题,但客户端不会遇到任何问题。谢谢

一个人之前回答过同样的情况

这就是我所做的:我的所有 30 多个函数(并且列表不断增长)都将字符串、整数和字节()作为数据类型作为输入和输出参数,我创建了一个主单一端点和函数,用于接收,如一个输入参数,并作为输出返回一个简单的类。这个名为 HostInterface 的类只包含两个参数,一个字符串(我用它来封装我的所有字符串和整数)和一个 byte() 数组(我将所有二进制文件都填充到其中)

因此,无论客户是调用像 Ping() 这样简单的字符串参数,还是像 ResumeDownload() 那样使用 5 个字符串、2 个整数和一个字节数组的复杂函数,所有这些参数都封装在我的 HostInterface 类中,字符串并将整数放入一个字符串参数(如 XML)中,并将字节放入字节字段中。

我很欣赏他的回答,但真的不明白如何实施。所以如果有人去这个网址如何更改不影响客户端的 WCF 服务合同?

然后就知道他说了什么。

我正在寻找小的完整 wcf 服务代码,它可以帮助我可视化如何设计服务合同,如果我们稍后扩展服务合同的功能,那么将使用我的服务的客户将不会遇到任何问题。

并告诉我其他可能的指导方针来解决这种情况。谢谢

4

2 回答 2

2

我认为创建通用端点的建议是个坏主意。通过创建一个接受任何类型输入的方法,您已经失去了 C# 中的 WCF 为您带来的所有强类型化优势。您仍然需要努力与老客户打交道,但现在您必须在应用程序代码中通过检查传入的数据并启发式地决定它假定的“版本”来完成这项工作。在我看来,这类似于创建一个 SQL 数据库表,其中包含数十个名为iddata1data2data3data4等的列,然后将各种不相关的数据存储在该表中。

如果您需要进行的合同更改是向后兼容的,那么您可以将它们就地添加到合同中。添加新方法是向后兼容的,因为它不会影响现有方法的可用性。

如果您需要进行向后不兼容的更改(例如删除方法或更改现有方法的参数),最简单的答案可能是创建一个位于新地址的新合约。如果在 http://example.com/v1/MyService 达到了合同的第 1 版,则在http://example.com/v2/MyService达到了第 2 版。

为了避免在合约没有太大变化的类之间重复大量代码,实现合约的类可能会相互继承。一种方法可能是:

namespace V1
{
    [ServiceContract]
    public interface IService { ... }
    public class MyService : IService { ... }
}

namespace V2
{
    [ServiceContract]
    public interface INewService { ... }
    public class MyNewService : V1.MyService, INewService { ... }
}

或者你可以使用组合:

public class MyNewService : INewService
{
    private readonly V1.MyService v1service = new V1.MyService();

    public int SomeMethod()
    {
        return this.v1service.SomeMethod();
    }
}

这样,MyNewService实现了 的所有功能MyService,但只有INewService通过 WCF 公开的方法才可用。通过 v2 URL 访问您的服务的任何人都将获得新功能。使用旧服务的客户端将继续使用 v1 URL,直到他们准备好升级。

于 2014-01-30T08:17:27.237 回答
1

如果我正确理解了您的问题,那么 ChannelFactory 类可能会帮助您(至少部分)。此处的链接将帮助您入门。

此外,您可能希望使用 IExtensibleDataObject 来实现前向兼容性。检查此处的链接以获得更好的理解。

希望这可以帮助。

于 2014-01-30T07:53:26.820 回答