6

例如,我在 IIS 中托管了两个服务。

[ServiceContract]
public interface IDeviceService
{
    [OperationContract]
    DeviceCollection GetAllDevices(Customer customer);

}

[ServiceContract]
public interface IUserService
{
    [OperationContract]
    User Authenticate(string username, string password);

}

从 UserService 中的 Authenticate 操作返回的 User 对象和从 DeviceService 中的 GetAllDevices 操作返回的 DeviceCollection 都有一个 Customer 的子对象定义。Customer 是一个业务对象,与 User 和 Device 对象在同一个程序集中。

我的问题出在客户端 - 当我调用设备操作时

userProxy.GetAllDevices(user.Customer);

编译器抱怨以下消息:

参数 1 - 无法从 UserService.Customer 转换为 DeviceService.Customer

我可以很好地连接到这两个服务,问题是客户的对象定义。我真的不想把操作放在同一个服务中,因为它们似乎自然地生活在自己的服务中。我想我要问的是其他程序员如何处理这样的问题?

干杯,斯图尔特

4

4 回答 4

3

如果您想在多个服务之间共享一个数据契约,那么您必须将相关数据契约编译到它自己的程序集中,然后将该程序集分发给客户端。

即使类型看起来相同,但它实际上是两种不同的类型,这就是为什么您会看到您所看到的错误。您唯一的其他选择(除了单独的共享程序集)是将这两个服务组合为一个,以便它们可以共享数据契约。

于 2009-06-23T15:34:32.200 回答
2

一种选择是在客户端上使用AutoMapper将一种类型无缝转换为另一种类型。由于它们具有相同的属性,因此映射将很简单。

于 2009-07-21T19:43:18.900 回答
0

我想我会尝试用关于我如何克服这个解决方案的详细信息来回答我自己的问题。它基于Dan Meineck 的博客文章中的一篇文章。

总结一下,我认为我为每个根业务实体提供多种服务的概念是错误的。

相反,我公开了一个实现多个 DataContracts 的服务,例如

public partial class DeviceService : IDeviceService, IUserService
{
}

因为设备服务是作为部分类创建的,所以我可以将服务分开,我说的是分开的,它们仍然是同一个服务,但它允许我将它们分成单独的文件并为服务提供一些结构组织。

实现的最后一部分是在服务定义中声明两个端点,例如

<service behaviorConfiguration="GPSCloudHost.DeviceServiceBehavior" name="BusinessService.DeviceService">
<endpoint address="Device" binding="wsHttpBinding"   contract="BusinessService.DataContracts.IDeviceService"></endpoint>
    <endpoint address="User" binding="wsHttpBinding"   contract="BusinessService.DataContracts.IUserService"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

我在 WCF 方面没有足够的经验来判断这是否是“正确”的解决方案,但它可以满足我的要求。如果其他人有更好的解决方案,我很想听听!

干杯

于 2009-06-25T10:52:18.793 回答
0

这是一个语义问题。如果您想定义一个 UserService.Customer 和 DeviceService.Customer 在语义上是相等的,那么您应该将该数据契约物理地重构为一个单独的程序集。或者,如果您想将 UserService.Customer 和 DeviceService.Customer 定义为语义不同,则将它们保持为单独的类型并编写一个实用函数来从一个转换到另一个。

于 2009-06-25T11:02:28.850 回答