为单个服务实现的合同(每个合同)生成单独的 WSDL

Generate seperate WSDL for contracts (per contract) implemented by single service

我有一个实现两个合同的网络服务:

[ServiceContract]
public interface IServiceA
{
    [OperationContrcat]
    void OpertationA();
}

[ServiceContract]
public interface IServiceB
{
    [OperationContrcat]
    void OpertationB();
}

public class Service : IServiceA, IServiceB
{
 …
}

在我的 web.config 中,我为每个合同定义了具有单独端点的服务,它工作得很好,但我希望能够为每个合同导出 WSDL也分开。

目前我只为整个服务获得了一个 WSDL,当使用它时,会生成一个客户端,该客户端可以看到来自 IServiceAIServiceB 的两种方法。

我想知道是否有一种方法可以提供单独的 wsdl,如果我需要 ServiceAClinet,我可以使用仅定义来自 IServiceA 的方法的 wsdl 以及 IServiceB.

经过一番搜索,我发现 Single endpoint with multiple service contracts 这实际上是一个好主意,不需要太多额外的工作,但我想知道是否可以在没有包装器的情况下做到这一点?

提前致谢。

我最终使用了 Singleton 模式并实现了实现一项服务的便利性,并在某种程度上分离了与客户端有关的关注点。

编辑:

public class ServiceA : IServiceA {

    public void OperationA() {
        Service.Instance.Operation()
    }

}

ServiceB 也是如此。一旦我这样做了,我更改了我的 .svc 文件以仅为合同实现而不是主要服务生成 WSDL。

编辑 2:

虽然我确实找到了解决我的问题的方法,但这不是最佳做法。 @MickyD 回答的是一种更好的方法,即从一开始就使用 SOA 和 SOLID 原则设计服务,这将使您的服务更易于维护和销售。

虽然在 OOP 中派生自多个接口很有用,但对于 WCF 而言,它会带来值得怀疑的好处。通过合而为一,您可以强制所有人共享相同的实例上下文;并发性;以及可能的安全模型。

我建议您将服务分开。

  • 单独的服务实施项目(仅适用于您的情况,因为您需要单独的 WSDL,通常最好将服务实施放入单个项目中)
  • WCF 服务方法理想情况下应该只是 瘦包装器 到您在另一个项目中定义的与 WCF/REST/etc 无关的实际服务逻辑。让包装器委托对实现的调用

如果您遵循此建议,那么如何获取单独的 WSDL 的问题就会迎刃而解。

告诉我更多