WCF服务和Silverlight应用程序之间的共享数据对象

4
我有一个自定义的数据实体(数据对象),通过WCF Web服务公开。WCF服务位于Web应用程序中。然后,我有一个带有对该WCF服务的服务引用的Silverlight应用程序。当我添加服务引用时,会生成代理,其中包括自定义数据实体的版本。
我应该如何组织我的代码,使数据实体在一个地方声明,并在包含WCF服务的项目和任何引用它的Silverlight应用程序之间共享?我想消除与代理一起生成的数据实体版本。
3个回答

6

这就是我尝试做的事情,但让它工作起来很间歇性。VS表现出了奇怪的行为 - 我勾选了“重用...”复选框,每次重新创建或更新服务引用时,它仍会在代理中生成项目。然后我对其中一个共享对象进行了微小的调整,再次更新服务引用,它就奇迹般地工作了...很奇怪。然后我不得不注释掉我放置的所有映射代码,因为这种行为。 - slugster

1

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

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

我尝试过使用此方法,但发现使用DTO并将其映射到Silverlight端的实体更加清晰和易于处理,尽管我编写了一堆映射代码来将DTO转换成实体及相反的情况。


谢谢Dave,我已经准备好了映射代码,直到我成功地让重用功能按照标记为答案的帖子所述正常工作。映射代码是一个很好的解决方法,但由于对象完全相同但位于不同的命名空间中,因此非常麻烦。 对于任何想知道我如何进行映射的人,我扩展了部分类并包含了一个新构造函数,该构造函数接受要映射的对象的实例: MyProxyDataObject = new MyProxyDataObject(mySharedObject) 等等。 - slugster
如果WCF和Silverlight对象不完全匹配,这种映射技术非常好。主要的麻烦是在将一个对象的值(如枚举)转换为另一个对象时必须使用完整的命名空间(我并不总是需要使用完整的命名空间,但如果我不这样做,那么当其他开发人员查看代码时,可能会导致混淆)。 - slugster

0
我不太确定为什么有人想这样做。你必须理解代理中找到的类型是服务端站点上拥有的类型的投影。它在 *.g.cs 文件中定义,并且如果你更新服务引用,它会被重新生成。 在我看来,最好的方法是在一个单一的位置声明并进行投影。你需要在两个地方使用它,而且它只有一个定义。 无论如何,我的观点可能是错误的......

1
生成的数据对象代理版本可能存在多种问题。在我的情况下,我想在不同版本的用户界面中使用相同的数据对象。这是一种常见的方法,但在这种情况下,由于Silverlight应用程序无法引用非Silverlight程序集,因此变得更加困难。即使通过在项目之间引用文件来解决这个问题,也可能会出现名称空间问题,它并不能真正地引用数据对象的一个定义。 - slugster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接