c# - WCF设计原则: Is it a good idea to edit auto-generated proxy classes?

标签 c# wcf

<分区>

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

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

我注意到代理类被标记为部分。所以我想创建另一个将添加到这些响应类中的类文件。但是我当然不能覆盖默认构造函数。

你有什么建议?我应该自己编辑自动生成的代理类还是有任何其他方法来处理这个问题?

最佳答案

您根本没有使用生成的代理类。您可以在 contracts-only .dll 中定义您的数据契约类和服务接口(interface),并在需要访问这些类型和接口(interface)的项目中引用它们。从某种意义上说,这与代理提供的内容并没有太大不同。

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

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是您服务的成熟代理。请注意,创建 channel 工厂的调用使用了客户端应用程序配置中 wcf 客户端配置的名称。有些重载不使用配置 - 您自己传递绑定(bind)和端点。您可以选择任何一种方式。

如果您喜欢使用代理,您可以扩展它们。正如您所注意到的,它们是部分类,您可以添加有用的行为。我曾从事过这样做的项目,并且对这种方法可能造成的困惑感到震惊。我绝对建议不要编辑生成的部分。保留默认构造函数。添加更多构造函数并使用它们……但不要弄乱生成的代码。您会惊讶于需要重新生成代理的次数(因为您的服务会随着时间的推移而变化)。

我随意使用术语contracts-only .dll。如有必要,可以在您的服务中重新定义数据契约和服务接口(interface)...只要类型名称和结构匹配(对于数据契约)以及方法名称和签名匹配(对于服务方法)。有时,客户端上的类型与服务上的类型具有不同的行为是很有用的。保持不同类型的同步变得有点麻烦。在我从事的项目中,我们尝试将所有内容都保留在契约(Contract) .dll 中,并在服务和客户端中引用它。有时会出现与版本控制相关的问题,但这对我们很有用。

本文将概述使用 channel 工厂:

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

请注意,第 2 步要求运行 svcutil.exe 以创建与我们的仅契约(Contract) .dll 等效的文件。 Svcutil.exe 将根据服务中的内容构建数据协定类和接口(interface)类型。如果您已经拥有一项服务,这可能是一个很好的起点。

关于c# - WCF设计原则: Is it a good idea to edit auto-generated proxy classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488083/

相关文章:

c# - 如何加快统一项目的运行?

c# - 如何处理 .NET 中可选字段的外键

c# - 如何在代码隐藏中创建 ResourceDictionary?

c# - Linq 按 bool 值排序

ruby-on-rails - 如何使用 ruby​​ 使用 wcf 服务?

c# - 在 WCF 中自定义 SOAP header 命名空间前缀

c# - NServiceBus批处理消息

将 WSDL 中定义的响应反序列化为空消息时,WCF 使用 SOAP 会出错

wcf - 使用 DataAnnotations 通过 WCF 引用 MVC 模型

wcf - 可以使用带有用户名/密码和客户端证书的 WCF STS 吗?