c# – WCF设计原则:编辑自动生成的代理类是一个好主意吗?

这个问题可能太天真了.我对WCF很新.

我有一个自动生成的WCF代理类,其中包含所有DataContracts. DataContracts也有一些响应类.每个类都有一个默认的无参数化构造函数,它最终什么都不做.我想初始化类的一些成员,以便我可以将这些属性设置为默认值,而且每次我需要使用它时都不必设置它.

我注意到代理类被标记为partial.所以我想创建另一个类文件,它将添加到这些响应类.但后来我无法覆盖默认的构造函数.

你有什么建议?我应该编辑自动生成的代理类本身还是有其他方法来处理它?

最佳答案 您根本不必使用生成的代理类.您可以在仅合同.dll中定义数据协定类和服务接口,并在需要访问类型和接口的项目中引用它.这与代理在某种意义上提供的内容并不完全不同.

然后,在您的客户端项目中,您可以使用ChannelFactory< IService>创建服务代理的实例.我真的更喜欢使用生成的代理.要创建服务通道工厂,您可以执行以下操作:

private static ChannelFactory<IRepositoryService> GetRepositoryServiceChannelFactory( )
{
  lock ( s_sync )
  {
    if ( s_repositoryServiceChannelFactory == null )
    {
      s_repositoryServiceChannelFactory = new ChannelFactory<IRepositoryService>( Properties.Settings.Default.ConfigName );
    }
  }
  return s_repositoryServiceChannelFactory;
}

…然后,当你想要一个服务实例时……

public IRepositoryService GetRepositoryService( string configName )
{
  return GetRepositoryServiceChannelFactory( ).CreateChannel( );
}

是的,IRepositoryService是您服务的完整代理.请注意,创建通道工厂的调用在客户端应用程序的配置中使用了wcf客户端配置的名称.有些重载不使用配置 – 您自己传递绑定和端点.你可以去任何一个方向.

如果您喜欢使用代理,可以扩展它们.正如您所注意到的,它们是部分类,您可以添加有用的行为.我曾经做过这样做的项目,并且被这种方法弄得一团糟所震惊.我肯定会建议不要编辑生成的部分.保留默认构造函数.添加更多构造函数并使用它们……但不要混淆生成的代码.您会惊讶于需要重新生成代理的次数(随着时间的推移,您的服务会发生变化).

我松散地使用了仅限合约.dll这个术语.如果需要,可以在服务中重新定义数据协定和服务接口……只要类型名称和结构匹配(对于数据协定),方法名称和签名匹配(对于服务方法).有时,客户端上的类型与服务上的类型具有不同的行为是有用的.保持不同类型同步变得有点麻烦.在我正在进行的项目中,我们尝试将所有内容保存在合同中.并在服务和客户端中引用它.有时会出现与版本相关的问题,但它对我们有用.

本文将概述使用通道工厂:

https://msdn.microsoft.com/en-us/library/ms734681(v=vs.110).aspx

请注意,步骤2表示运行svcutil.exe以创建仅限合同.dll的等效项. Svcutil.exe将根据服务中的内容构建数据协定类和接口类型.如果您已经有服务,这可能是一个很好的起点.

点赞