如何通过WCF公开对象?

时间:2008-10-09 12:20:36

标签: .net wcf silverlight

我的项目分为Silverlight应用程序的典型3层结构。那就是:

  • 基础层,它是一个包含所有业务对象,逻辑,数据访问等的类库。
  • 中间层,它是与之通信的WCF服务;
  • 我的Silverlight前端

我遇到的问题是,目前通过WCF向我的UI公开的BO只包含私有变量,而不包含任何属性或方法。

是否有一种简单的方法来公开整个对象(通过属性或配置)?

什么是最佳解决方案?

4 个答案:

答案 0 :(得分:8)

您似乎期望WCF服务中使用的内部类(已标记为DataContracts)作为.NET对象导出到客户端代码(Silverlight UI)。 WCF不支持此功能。标记为DataContract的类只是一个没有方法的数据结构。如果您需要一个很好的未来WCF资源,请尝试Learning WCF: A Hands-on Guide by Michele Bustamente

@John Fisher确实勾勒出一种向客户端和客户端公开.NET对象的方法。服务,但这可能不是Silverlight的选项。这是一个blog entry,解释了如何从Silverlight访问基于REST的服务。

答案 1 :(得分:2)

使用[DataContract]属性标记服务正在使用的对象,然后将[DataMember]放在公共属性上。这将解决您的问题。

答案 2 :(得分:1)

我通过创建一个“通信层”dll在一个小项目上做了类似的事情,它只包含在客户端和服务器之间传递的对象。这个的变体(在需要这些对象的所有项目之间共享一个dll)应该对你有用。但请注意版本问题。除非你完全控制两端,否则升级到一端可能会引起麻烦,如果你不小心的话。

答案 3 :(得分:1)

Sixto's answer是正确的。使用WCF,您可以在客户端和服务之间共享BO DLL并重用这些对象(只需以这种方式配置WCF服务引用),但这不适用于您的情况。问题是您的BO项目是标准的.NET项目而不是Silverlight项目。

通常,我的项目结构与您的项目略有不同:

  • 公共对象 - 这些是使用WCF属性标记的数据结构,还包含任何常见接口,例如我的数据层接口。
  • 数据访问 - 任何数据访问对象。它仅引用公共对象并从数据调用中返回它们。
  • 业务逻辑(可选) - 如果有其他Web服务与其自身层中的棒接口
  • 服务 - 实际的WCF服务,通过接口直接引用Common和其他项目
  • Silverlight - 引用服务

如果您将业务逻辑移到其项目中并且只引用了常见的“哑”对象,那么您可以创建两个逻辑项目,一个silverlight和一个标准,并且只需将实际文件放在一个中并创建链接另一个中的那些文件。这样,您将在两个项目中获得相同的逻辑,并且它将存在于Silverlight和标准.NET中。