gpt4 book ai didi

silverlight - 解决 WCF 服务中不明确引用问题的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 00:28:19 25 4
gpt4 key购买 nike

项目结构

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

问题描述

现在,在我的 ServiceClients 项目中,当我需要使用两个服务引用中都存在的数据契约(Contract)类时,我遇到了一个不明确的引用问题。如果这是一个 winforms 或 webforms 项目,我可以引用 MyDataContracts.dll 并重用通用类型。但是,由于这个 MyDataContracts.dll 是使用非 silverlight 类库构建的,因此无法在 silverlight 项目中引用它

解决方法...

我不确定下面的方法是否是解决此问题的最佳方法。谁能告诉我是否有更简洁的方法来解决这个问题,或者这是我们迄今为止最好的方法?

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

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

最佳答案

使用自动映射器

AutoMapper 映射 DataContract .

您将不得不投入一些时间来了解 AutoMapper 并重新设计您的应用程序。 AutoMapper 还增加了开销,因为所有数据对象都将被映射。但首先,您将拥有一个没有黑客攻击的干净解决方案,其次,您将获得一个仅供您的客户使用的解耦且简单的数据对象层。完成后,您可以忘记映射,但可以灵活应对 future 的变化。

如果您从未使用过 Automapper,那么在开始之前先试用一下它很重要。 Automapper比较特殊,需要一些时间来熟悉。

就是这样。这些是粗略的步骤:

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

2. 创建 AutoMapperInit.cs,如 Automapper 中所述(阅读入门指南)。使用这样的冲突引用:

using ref1 = YourProjectServiceReference1;
using ref2 = YourProjectServiceReference2;

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

Example GetExample() {
return AutoMapper.Map<ref1.Example, Example>(ref1.YourService.GetExample());
}

包装器还需要与步骤 2 中相同的 using 指令。

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

static Wrapper() {
AutoMapperInit.CreateMaps();
}

5. 省略客户端中的服务引用并使用 using YourClient.Data;,即您在步骤 1 中创建的命名空间。

您的客户端现在已与服务分离,您不再有冲突。

免责声明:我不隶属于 AutoMapper。我刚刚在一个有类似问题的项目中使用它,我很满意它并想分享我的经验。

关于silverlight - 解决 WCF 服务中不明确引用问题的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com