Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net &引用;抄袭;WCF代理代码中的类_.net_Wcf_Architecture - Fatal编程技术网

.net &引用;抄袭;WCF代理代码中的类

.net &引用;抄袭;WCF代理代码中的类,.net,wcf,architecture,.net,Wcf,Architecture,我们正在使用WCF和VisualStudio2008构建一个大型分布式应用程序。我们在WCF方面没有太多的经验,所以我们正在投资一些时间来原型化客户端和服务器之间的WCF通信。我们已经观察到,在我们的服务器子系统中,WCF服务作为参数或返回类型引用的任何类都会被VisualStudio通过生成的代码“复制”到客户端代理中。我感到惊讶的是,在执行此操作时,VisualStudio更改了类的名称空间。例如,假设我有以下代码: namespace MyLibrary { class MyCla

我们正在使用WCF和VisualStudio2008构建一个大型分布式应用程序。我们在WCF方面没有太多的经验,所以我们正在投资一些时间来原型化客户端和服务器之间的WCF通信。我们已经观察到,在我们的服务器子系统中,WCF服务作为参数或返回类型引用的任何类都会被VisualStudio通过生成的代码“复制”到客户端代理中。我感到惊讶的是,在执行此操作时,VisualStudio更改了类的名称空间。例如,假设我有以下代码:

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。我一定会看看高级选项。