【问题标题】:What is the correct way to solve the ambiguous reference issue in WCF services?解决 WCF 服务中不明确的引用问题的正确方法是什么?
【发布时间】:2011-10-29 18:06:40
【问题描述】:

项目结构

我有一个 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" 
    
  • 保存、关闭和更新服务参考。

【问题讨论】:

    标签: silverlight wcf


    【解决方案1】:

    使用自动映射器

    DataContracts 与AutoMapper 映射。

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

    如果您从未使用过 Automapper,请务必在开始之前尝试一下它。 Automapper 比较特殊,需要一些时间来熟悉它。

    所以那里。这些是粗略的步骤:

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

    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.省略客户端中的服务引用并使用您在步骤 1 中创建的命名空间 using YourClient.Data;

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

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

    【讨论】:

    • 哇。感谢您的详细步骤。不幸的是,我已经标记了一个正确的答案。很久以前我也停止了silverlight的工作:)但我相信这个答案会对其他人有所帮助。再次感谢您的详细努力。干杯。
    • 不客气。顺便说一句,我不使用 Silverlight,但您的问题适用于所有 WCF 客户端。
    【解决方案2】:

    您的解决方法实际上还可以。我们已经在这样的几个项目中使用了它,其中包含 3 个服务引用。这实际上是 IDE 的一种解决方法,由于某种原因,它只允许一次选择一个服务来创建服务引用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2012-10-10
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多