【问题标题】:Shared data object between WCF service and Silverlight appWCF 服务和 Silverlight 应用程序之间的共享数据对象
【发布时间】:2009-11-06 04:08:54
【问题描述】:

我有一个通过 WCF Web 服务公开的自定义数据实体(数据对象)。 WCF 服务存在于 Web 应用程序中。然后,我有一个 Silverlight 应用程序,其中包含对该 WCF 服务的服务引用。当我添加服务引用时,会生成一个代理,其中包括自定义数据实体的一个版本。

我应该如何构造我的代码,以便在一个地方声明数据实体,并在包含 WCF 服务的项目和任何引用它的 Silverlight 应用程序之间共享?我想消除使用代理生成的数据实体的版本。

【问题讨论】:

    标签: wcf silverlight


    【解决方案1】:

    how to do this here by Pete Brown 有一个很好的例子。使用这种方法,您可以在 Silverlight 客户端和 WCF 服务中使用相同的类,而无需使用生成的对象。

    【讨论】:

    • 这是我试图做的,但让它工作是断断续续的。 VS 的奇怪行为 - 我勾选了“重用...”复选框,每次我重新创建或更新服务引用时,它仍然会在代理中生成项目。然后我对其中一个共享对象进行了微小的调整,再次更新了服务引用,它就起作用了……很奇怪。然后我不得不注释掉我因为这种行为而输入的所有映射代码。
    【解决方案2】:

    在 WCF 服务或服务引用的项目中声明数据实体,然后从 Silverlight 项目中将实体添加为链接,并确保从“服务引用设置”对话框中选中“在引用的程序集中重用类型”复选框。

    您可以将类型放在 Silverlight 或 WCF 端。

    我尝试过以这种方式做事,并发现使用 DTO 代替并将它们映射到 Silverlight 端的实体会更加清洁和易于使用,尽管我确实编写了一堆映射代码来将 DTO 放入实体,反之亦然。

    【讨论】:

    • 感谢 Dave,在我设法让重用功能正常工作之前,我一直在做映射代码(根据标记为答案的帖子)。映射代码是一个很好的解决方法,但是作为对象的 PITA 是相同的,只是在不同的命名空间中。对于任何对我如何进行映射感到好奇的人,我扩展了部分类并包含了一个新的构造函数,该构造函数采用要映射的对象的实例:MyProxyDataObject = new MyProxyDataObject(mySharedObject) 等等。
    • 如果 WCF 和 Silverlight 对象彼此不完全匹配,这种映射技术非常有用。当您将值从一个对象转换为另一个对象(如枚举)时,主要的麻烦是必须使用完整的命名空间(我不必一直使用完整的命名空间,但如果我没有,那么它会导致当其他一些开发人员不得不查看代码时感到困惑)。
    【解决方案3】:

    我不太清楚为什么有人要这样做。您必须了解您在代理中找到的类型是您在服务服务器站点上的类型的投影。它在 *.g.cs 文件中定义,如果您更新服务参考,它会生成新的。 在我看来,这是在单个位置声明并投影它的最佳方式。您在两个地方都需要它,而且它是单一定义的。

    反正我可能错了.....

    【讨论】:

    • 生成的数据对象的代理版本会很糟糕的原因有几个。就我而言,我想在不同版本的 UI 中使用相同的数据对象。这是一种相当常见的方法,但在这种情况下,Silverlight 应用程序无法引用非 Silverlight 程序集这一事实使这种方法变得更加困难。即使您通过在项目之间引用文件来解决这个问题,它可能会很麻烦,您最终可能会遇到命名空间问题,它并没有真正引用数据对象的一个​​定义。
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2015-04-04
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多