这个问题可能太天真了.我对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将根据服务中的内容构建数据协定类和接口类型.如果您已经有服务,这可能是一个很好的起点.