2009-06-23 124 views
6

例如,我有两个托管在IIS中的服务。两个具有不同合同但业务对象相同的WCF服务

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

} 

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

} 

无论是从UserService的身份验证操作返回与用户对象是从DeviceService的GetAllDevices操作返回的DeviceCollection有客户的子对象的定义。 Customer是业务对象与User和Device对象位于同一个程序集中。

我的问题是在客户端上 - 当我打电话的设备操作

userProxy.GetAllDevices(user.Customer); 

编译器与以下消息抱怨:

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

我可以连接到这两个服务罚款,这是客户的对象定义是这个问题。我并不想将这些运营部门放在与他们自己的服务自然生活相同的服务中。我想我问的是如何让其他程序员处理这样的问题?

干杯, 斯图尔特

回答

3

如果你想分享跨多个业务数据的合同,那么你将不得不编译有关数据合同到自己组装,然后该程序集分发到客户端。

尽管类型出现是相同的,但它实际上是两个不同的类型,这就是为什么你看到你所看到的错误。您唯一的选择(除了单独的共享程序集之外)是将这两个服务合并为一个,以便他们可以共享数据合同。

+2

此外,添加服务引用时,您想使用“高级”选项卡指定应共享哪些类型。 – 2009-06-23 15:37:27

+0

Hiya,两种服务相结合的问题是他们最终会变得庞大。我在Jual Lowrys的书中读到过,你应该努力不要再让这12个服务合同成员? – Simian 2009-06-23 16:03:38

+0

@Stuart - 我不会仅仅因为这个原因而推荐合并服务。我相信你的服务是有目的地分开的,所以把他们聚集在一起并不总是合情合理的。我只是想确保你知道每一个选项。 – 2009-06-23 16:09:36

0

我想我会试图回答我自己的问题,详细说明我会如何来解决这个问题。它基于blog article by 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经历了足够多说,如果这是“正确的”申报两个端点解决方案或不是,但它正在满足我的要求。如果其他人有更好的解决方案,我很乐意听到它!

干杯

0

这是一个语义问题。如果你想定义一个UserService。Customer和DeviceService.Customer在语义上相同,那么您应该将该数据合约重新分配到单独的程序集中。或者,如果要将UserService.Customer和DeviceService.Customer定义为语义不同,请将它们保留为单独的类型并编写实用程序函数以将其从一个转换为另一个。

2

一种选择是在客户端上使用AutoMapper将一种类型无缝转换为另一种类型。因为他们具有相同的属性映射将是直接的。

相关问题