2

我目前正在重构一个大型 WCF 服务,该服务由多个不同客户端应用程序使用的一个服务合同接口(从这里开始为“SCI”)组成。我已经拆分了 SCI,因此对于每种类型的客户端应用程序,都有一个特定于其所需操作的 SCI。SCI 的一些共享部分在基础 SCI 中定义,客户端应用程序特定的 SCI 继承该基础 SCI。

有一个服务类可以实现所有客户端特定的 SCI。共享基础 SCI 存在菱形接口继承情况这一事实有时意味着同一操作可通过多个 SCI 获得。当自动生成客户端(尤其是使用异步客户端方法)时,生成的代码有很多丑陋的<generated-type>1,2,3等等......

为了避免这种情况,我想为每个客户端应用程序添加一个服务引用,它只为与该特定应用程序相关的 SCI 生成一个客户端。由于相同的功能出现在不同的 SCI 上,这应该不会导致任何问题。

这可能吗?

在这种情况下实现模块化和代码重用的任何其他技巧也将不胜感激。

4

2 回答 2

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();
于 2011-12-13T23:47:52.683 回答
0

卢克的建议值得一试。'ChannelFactory' 方式比自动生成方式有很多优点:你可以保留你的 SCi 的评论,并且在 SCI 更改后不需要更新引用。

在生产中,您可能需要为性能做一些 Singleton chache,并为 Service 实现单独的 SCI,因此您可以在客户端和 Service 实现中引用您的 SCI。

您提到了“异步”,我认为这可能是绑定或行为配置问题。

private ChannelFactory CreateFactoryInstance<T>(string endpointConfigurationName, string endpointAddress)
{
    ChannelFactory factory = null;
    factory = new ChannelFactory<T>(endpointConfigurationName, new EndpointAddress(endpointAddress));
    factory.Open();
    return factory;
}
于 2011-12-14T00:48:01.730 回答