解决WCF服务中模糊引用问题的正确方法是什么?

时间:2011-10-29 18:06:40

标签: silverlight wcf

项目结构

我有一个Silverlight项目SLProj,它引用了一个名为ServiceClients的silverlight类库项目。 ServiceClients有两个wcf服务引用,Svc1.svc和Svc2.svc。 Svc1.svc和Svc2.svc都在两个不同的WCF项目中,这些项目使用同一组DataContracts,这些DataContracts再次位于名为MyDataContracts.dll的不同类库项目中。

问题描述

现在在我的ServiceClients项目中,当我需要使用两个服务引用中都存在的datacontract类时,我会得到一个模糊的引用问题。如果这是winforms或webforms项目,我可以引用MyDataContracts.dll并重用常见类型。但是,因为,这个MyDataContracts.dll是使用非silverlight类库构建的,它无法在silverlight项目中引用

解决方法...

我不确定以下是否是解决此问题的最佳方法。有没有人让我知道是否有更清洁的方法来解决这个问题,或者这是我们迄今为止最好的方式?

  • 创建单个服务引用。
  • 点击解决方案资源管理器中的“显示所有文件”按钮
  • 深入查看服务参考并找到Reference.svcmap并将其打开
  • 找到MetadataSources部分
  • 添加第二行以包含第二个服务的地址。例如:

    MetadataSource Address="http://address1.svc" Protocol="http" SourceId="1" 
    MetadataSource Address="http://address2.svc" Protocol="http" SourceId="2" 
    
  • 保存,关闭和更新服务参考。

2 个答案:

答案 0 :(得分:2)

使用自动播放器

使用AutoMapper映射DataContract

您需要投入一些时间来了解AutoMapper并重新处理您的应用程序。此外,AutoMapper还会增加开销,因为所有数据对象都将被映射。但首先,您将拥有一个没有黑客的干净解决方案,然后您只需为您的客户端获得一个解耦且简单的数据对象层。完成后,您可以忘记映射,但您可以保持灵活性,以便将来进行更改。

如果您从未使用过Automapper,那么在开始之前使用它是很重要的。 Automapper很特别,需要一些时间来熟悉它。

那么。这些是粗略的步骤:

1。创建子目录和子命名空间Data并复制DataContract。删除客户端不需要的属性和属性,因为这些映射的类仅存在于客户端中。您还可以更改某些类型或展平某些复杂属性。

2。创建一个{1}},如Automapper所述(请参阅“入门指南”)。使用这样的冲突引用:

AutoMapperInit.cs

3. 像这样包装服务客户端:

using ref1 = YourProjectServiceReference1;
using ref2 = YourProjectServiceReference2;

包装器还需要与步骤2中相同的Example GetExample() { return AutoMapper.Map<ref1.Example, Example>(ref1.YourService.GetExample()); } 指令。

4. 在这个包装器中添加一个这样的静态初始化器(假设您的包装器类被称为using):

Wrapper

5. 忽略客户端中的服务引用,并使用static Wrapper() { AutoMapperInit.CreateMaps(); } ,即在步骤1中创建的命名空间。

您的客户现在已与服务脱钩,您不再有冲突。

免责声明:我不隶属于AutoMapper。我只是在一个有类似问题的项目中使用它,并对此感到满意,并希望分享我的经验。

答案 1 :(得分:1)

您的解决方法实际上非常好。我们在这样的几个项目中使用了它,有3个服务引用。它实际上是IDE的一种解决方法,由于某种原因,它只允许选择一个服务来一次创建服务引用。

您可以尝试的另一件事是使用相同的代码库将您的共享合同多目标定位到.NET和Silverlight。 http://10rem.net/blog/2009/07/13/sharing-entities-between-wcf-and-silverlight中描述了如何执行此类操作的详细信息。可能会更多的工作,但感觉不那么黑。