【问题标题】:How to split WCF contract without duplication?如何在不重复的情况下拆分 WCF 合同?
【发布时间】:2018-11-29 17:57:19
【问题描述】:

我想将服务重构为多个子服务,按业务范围分开:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    int Method1();
    [OperationContract]
    int Method2();
}

还有一些用户已经在使用它,所以我不能只是猛烈抨击他们,对他们说“再见”,然后重构所有东西。

因此,为了避免重复,我预先使用了抽象和接口,在这种情况下,我尝试将合约分离到多个接口,并将主要接口作为聚合器:

[ServiceContract]
public interface IMyService : IMySubService1, IMySubService2
{
}

[ServiceContract]
public interface IMySubService1
{
    [OperationContract]
    int Method1();
}

[ServiceContract]
public interface IMySubService2
{
    [OperationContract]
    int Method2();
}

我认为这会解决问题,但是不——它破坏了那些客户端,因为现在这些方法位于 WSDL 中的不同路径上,即使我只托管 IMyService

原来是:net.tcp://foobar/IMyService/Method1

变成了:net.tcp://foobar/IMySubService1/Method1

这是一个问题。我不能在没有重复代码的情况下将我的合约分成接口(一个用于实现,一个显式聚合用于合约),有什么办法可以解决吗?

【问题讨论】:

  • 重构您的业务逻辑,以便您可以在任意数量的端点上使用它,服务合约应该只是一个薄层,并将调用传播到实际服务,这不应该有任何线索如果它在 wcf 之上运行。
  • 我正在重构,谢谢。关于在没有代码重复的情况下拆分合同的任何建议,或者为什么我没有询问并且没有聚合的 WCF 托管接口?
  • 如果您想保持对旧合约的向后兼容性并提供新的单独合约,那么您无能为力,只需尽量减少对 wcf 服务层的损害并在分离的代码之间共享代码合同。
  • 是的,我正是想要那个。我想也许有一种方法可以告诉 WCF 发送聚合的 WSDL,而不是由接口分隔的多个 WSDL
  • @eocron 不要那样做。这里没有重复 - 您不仅有不同的服务版本,它们是完全不同的服务。继承是一种非常强耦合,它将阻止您独立发展新服务。您可以重复使用相同的 DTO,直到您发现新服务也需要更改 DTO。 business 功能,actual 请求处理对于两个端点可能是相同的

标签: c# wcf


【解决方案1】:

设法这样做:

[ServiceContract(Name = nameof(IMyService))]
public interface IMyService : IMySubService1, IMySubService2
{
}

[ServiceContract(Name = nameof(IMyService))]
public interface IMySubService1
{
    [OperationContract]
    int Method1();
}

[ServiceContract(Name = nameof(IMyService))]
public interface IMySubService2
{
    [OperationContract]
    int Method2();
}

现在 WSDL 生成正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2014-06-11
    • 2012-08-05
    相关资源
    最近更新 更多