【发布时间】: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 请求处理对于两个端点可能是相同的