我有一个实现两个合同的Web服务:
[ServiceContract]
public interface IServiceA
{
[OperationContrcat]
void OpertationA();
}
[ServiceContract]
public interface IServiceB
{
[OperationContrcat]
void OpertationB();
}
public class Service : IServiceA, IServiceB
{
…
}
在我的 web.config 中,我为每个合同定义了单独的端点的服务,这很正常,但是我也希望能够分别为每个合同导出WSDL。
目前,我只获得整个服务的单个WSDL,使用该服务时,它会生成一个客户端,该客户端可以查看IServiceA
和IServiceB
中的两种方法。
我想知道是否有一种方法可以提供一个单独的wsdl,如果我需要ServiceAClinet
,我可以使用wsdl,该wsdl仅定义IServiceA
中的方法,而{{1 }}。
经过一番搜索,我发现这个Single endpoint with multiple service contracts实际上是一个好主意,不需要太多额外的工作,但是我想知道是否可以不用包装器来做到这一点?
谢谢。
答案 0 :(得分:1)
尽管在OOP中,从多个接口派生非常有用,但是对于WCF,它带来的好处令人怀疑。通过合二为一,您可以强制所有人共享同一实例上下文。并发以及可能的安全模型。
我敦促您将服务分开。
即
如果您遵循此建议,那么如何获得单独的WSDL的问题就会消失。
Erl,T, SOA Design Patterns ,2009
答案 1 :(得分:-1)
我最终使用Singleton模式进行了实现,并获得了实现一项服务的便利性,并在某种程度上分离了客户方面的问题。
编辑:
55
,与public class ServiceA : IServiceA {
public void OperationA() {
Service.Instance.Operation()
}
}
相同。完成该操作后,我将.svc文件更改为仅为Contract实现而不是主服务生成WSDL。
编辑2:
虽然我确实找到了解决问题的方法,但这并不是最佳实践。 @MickyD会回答一种更好的方法,即从一开始就使用SOA和SOLID原理设计服务,这将使您的服务更加可维护和可销售。