我目前正在重构一个大型WCF服务,该服务由多个不同客户端应用程序使用的一个服务契约接口(此处为“SCI”)组成。我已经拆分了SCI,因此对于每种类型的客户端应用程序,都有一个特定于其所需操作的SCI。 SCI的一些共享部分是在基础SCI中定义的,客户端应用程序特定SCI继承。
有一个服务类可以实现所有客户端特定的SCI。从共享基础SCI存在菱形接口继承情况的事实有时意味着通过多个SCI可以获得相同的操作。在自动生成客户端时(特别是使用异步客户端方法),生成的代码有许多丑陋的<generated-type>1,2,3
等...
为了避免这种情况,我想为每个客户端应用程序添加一个服务引用,这些客户端应用程序只生成与该特定应用程序相关的SCI客户端。由于相同的功能出现在不同的SCI上,这应该不会导致问题。
这可能吗?
在这种情况下实现模块化和代码重用的任何其他技巧也将受到赞赏。
答案 0 :(得分:1)
您要做的是创建一个服务合同接口(您可以手动执行此操作,将其从原始服务实现中拉出来或自动生成然后将其复制出来)。
然后使用通道工厂绑定到您的服务(如下所示),而不是使用服务引用。这是一种更好的引用WCF服务的方式。
您需要以下参考资料才能执行此操作:
using System.ServiceModel;
using System.ServiceModel.Description;
然后您可以使用以下内容:
var binding = new WebHttpBinding();
var factory = new ChannelFactory<IMyServiceContract>(binding, new EndpointAddress("http://url:port"));
factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
var myService = factory.CreateChannel();
myService.ServiceMethod();
答案 1 :(得分:0)
卢克的建议值得一试。 'ChannelFactory'方式比自动生成方式有许多优点:您可以保留SCi的注释,并且在SCI更改后无需更新引用。
在生产中,您可能需要为性能做一些Singleton chache,并为服务实现分离SCI,因此您可以在客户端和服务实现中引用您的SCI。
你提到'异步',我认为这可能是绑定或行为配置问题。
private ChannelFactory CreateFactoryInstance<T>(string endpointConfigurationName, string endpointAddress)
{
ChannelFactory factory = null;
factory = new ChannelFactory<T>(endpointConfigurationName, new EndpointAddress(endpointAddress));
factory.Open();
return factory;
}