1

我有多个DataContracts相同数量的 WCF 服务来管理每个服务的方法。我有一个特定的[DataContract]调用User,我在所有其他服务中用作参数,例如:ListCompany(User, CompanyId).

当一个服务引用 WCF 服务时,Company[DataContract] UserCompany.User原来的User. 有没有办法解决这个问题?

4

2 回答 2

2

逻辑上相同的 DataContract,用于多个服务

您可能正在使用Add Service Reference...菜单选项以通常的方式为 WCF 服务客户端添加服务引用。当您这样做时,Reference.cs将为每个服务生成一个文件,并且每个服务将具有不同的命名空间。但是,由于您要跨服务共享合同,因此您需要单击“添加服务引用”对话框上的“高级...”按钮,并确保选中引用的程序集中的重用类型,并(最简单)确保在所有引用的程序集中重用类型被检查。

现在,如果您实际上没有对包含这些[DataContract]类的程序集的正常项目或程序集引用,这将不起作用。所以,添加这些引用。如果这些类混合到您的服务器端实现中,您将需要将它们移动到它们自己的程序集中并在客户端和服务器上引用它们。

逻辑不同的 DataContract,用于 Multilpe 服务

如果您确实有两种不同类型的用户(即两种不同的合同),其中一个合同用于一个服务客户端,一个合同用于另一个服务客户端,则应确保未选中引用程序集中的重用类型,并确保每个服务引用都在不同的命名空间中。

另一种方法是在声明它们时为它们使用不同的名称:

[DataContract(Name = "User"]
public class User { ... }

[DataContract(Name = "CompanyUser")]
public class User { .... }

上面的代码假设每个User类都在不同的服务器端命名空间中,也可能在不同的程序集中。

于 2012-07-20T13:27:35.690 回答
0

我建议您应该寻找一种更好的方法来使用添加服务引用的 WCF 服务。这篇黄金文章描述了如何在所有解决方案之间共享数据合约,并通过使用 Chanel 工厂来使用它们,而无需 VS 为您生成大量代码。 http://www.netfxharmonics.com/2008/11/understanding-wcf-services-in-silverlight-2

可能看起来很多东西,但它充满了非常有用的技巧,包括没有魔法的服务访问,如下所示:

现在我们可以将注意力转向客户端应用程序。首先,让我先提醒大家不要在 Visual Studio 中使用“添加服务引用”来创建神奇的服务客户端。代码非常冗长,难以管理,编辑很容易被覆盖,并且几乎总是被用作不实际学习 WCF 的借口。没有什么比仅仅因为他们知道如何使用鼠标而不得不与了解产品的人打交道更糟糕的了。Juval Lowy 在他所有的书籍和演讲中,反复告诉人们避免使用这个有缺陷的功能是有原因的。幸运的是,作为专业人士,我们有能力了解如何在没有魔法的情况下做事。

正如我已经多次提到的,WCF 依赖于 ABC 的概念。我们已经了解了如何通过创建指定地址、绑定和协定的端点来配置 WCF 主机。事实证明,这也是客户端所需要的。对于 .NET 和 Silverlight,您可以在通道工厂中将地址和绑定与合同合并以创建通道。这不仅仅是花哨的概念架构师所说的,这正是您的代码的样子(非常好的架构的标志!)下面是我的意思的 .NET 版本:

BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
    EndpointAddress endpointAddress = new EndpointAddress("http://localhost:1003/Person.svc");
    IPersonService personService = new ChannelFactory<IPersonService>(basicHttpBinding, endpointAddress).CreateChannel();
    //+
    Person person = personService.GetPersonData("F488D20B-FC27-4631-9FB9-83AF616AB5A6");

非常值得一读。

于 2012-07-20T13:45:27.490 回答