.net &引用;抄袭;WCF代理代码中的类
我们正在使用WCF和VisualStudio2008构建一个大型分布式应用程序。我们在WCF方面没有太多的经验,所以我们正在投资一些时间来原型化客户端和服务器之间的WCF通信。我们已经观察到,在我们的服务器子系统中,WCF服务作为参数或返回类型引用的任何类都会被VisualStudio通过生成的代码“复制”到客户端代理中。我感到惊讶的是,在执行此操作时,VisualStudio更改了类的名称空间。例如,假设我有以下代码:.net &引用;抄袭;WCF代理代码中的类,.net,wcf,architecture,.net,Wcf,Architecture,我们正在使用WCF和VisualStudio2008构建一个大型分布式应用程序。我们在WCF方面没有太多的经验,所以我们正在投资一些时间来原型化客户端和服务器之间的WCF通信。我们已经观察到,在我们的服务器子系统中,WCF服务作为参数或返回类型引用的任何类都会被VisualStudio通过生成的代码“复制”到客户端代理中。我感到惊讶的是,在执行此操作时,VisualStudio更改了类的名称空间。例如,假设我有以下代码: namespace MyLibrary { class MyCla
namespace MyLibrary
{
class MyClass
{
//...
}
}
想象一下,我将其编译成MyLibrary.dll
,我的WCF服务对其有一个引用。我的一些WCF服务使用MyLibrary.MyClass
作为返回类型。当我查看生成的客户端代理代码时,我发现MyClass
自动可用(这很酷),但它不再位于MyLibrary
命名空间中,而是位于Visual Studio生成的命名空间中
我们计划拥有一个复杂的域对象模型,其中有数百个类分布在多个程序集中,我关心的是,这将如何像VisualStudio那样在整个代码生成过程中“移植”。此外,我担心我们设计的所有良好的名称空间层次结构可能会丢失。我们最初的设想是为这个域对象模型创建类库,并在服务器和客户端上对其进行delpoy。但是,由于WCF magic似乎为必要的类生成代码,我认为如果我们在客户机上部署自己的库,就会发生冲突
那么,我有两个具体问题:
- 在生成客户端代理代码时,是否有方法使Visual Studio使用原始名称空间方案而不是自己的名称空间方案?如果不是,这会影响我们的“复制”库在客户端上的可用性吗
- 我是否可以在客户端上部署原始库?我想不会,但那会引起什么样的冲突呢
谢谢。添加服务引用时,您可以单击“高级”按钮,在该按钮中,您可以选中“在引用的程序集中重用类型”框。您还需要确保拥有包含客户端项目中引用的原始类型的程序集 当然,您可以在客户机上部署原始库
WCF这样做的原因——其概念是,服务可能会被没有原始二进制文件,甚至不支持.net(例如Java)的客户机使用——因此服务边界发布客户机调用和处理其响应所需的一切 根据我最近在一个非常大的老项目中实现WCF的经验,我会避免使用Visual Studio模板化功能,比如瘟疫(对于大型项目),它只会让你头疼,并在将来产生幻觉问题 看看那篇文章。它回答了你当前的问题,并可能会防止未来的许多头痛
除上述内容外,如果传输层的实现和隔离良好,则完全可以重用组件,这是不使用VS模板的一个重要原因。您最初的设想完全可能实现。避免使用VisualStudio生成的客户端的一种方法是创建一个通用客户端,该客户端与服务器共享库服务接口以及绑定的实现(虽然后者不是必需的,但可以在app.config中使用相同的服务器/客户端绑定配置来完成,但如果最终设置类似,则很方便) 一些客户端c#示例代码可以帮助您理解:
// simplified extract from a generic service client lib,
// needs error mgmt channel disposal etc but the concept is there
// BindingFactory is our common implementation with server,
// bindingType is an enumeration, this could be built from
// configuration though or however you want
var binding = BindingFactory.CreateBinding(bindingType);
var endpointAddress = new EndpointAddress(serviceAddress,
EndpointIdentity.CreateSpnIdentity(string.Empty))
var channelFactory = new ChannelFactory<IMyLibrary>(
binding, endpointAddress);
var channel = channelFactory.CreateChannel();
// IMyLibrary is the interface implemented
// by the service found on serviceAdress
var result = ((IMyLibrary)channel).MyServiceFunction();
//从通用服务客户端库的简化提取,
//需要错误管理通道处理等,但概念是存在的
//BindingFactory是我们使用服务器的常见实现,
//bindingType是一个枚举,可以从
//尽管进行了配置,或者按照您的意愿进行配置
var binding=BindingFactory.CreateBinding(bindingType);
var endpointAddress=新的endpointAddress(serviceAddress,
EndpointIdentity.CreateSpnIdentity(string.Empty))
var channelFactory=新channelFactory(
绑定,端点地址);
var channel=channelFactory.CreateChannel();
//IMyLibrary是实现的接口
//通过在ServiceAddress上找到的服务
var result=((IMyLibrary)通道).MyServiceFunction();
+1谢谢Matt。我一定会看看高级选项。