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

时间:2016-05-27 16:11:52

标签: c# wcf

这个问题可能太天真了。我对WCF非常陌生。

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

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

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

1 个答案:

答案 0 :(得分:2)

根本没有 使用生成的代理类。您可以在 contract-only .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将根据服务中的内容构建数据协定类和接口类型。如果您已有服务,这可能是一个很好的起点。