0

我们正在尝试提出一种架构方法来设计一个前端作为基于浏览器的 xaml 应用程序运行的应用程序。

此应用程序联系使用 wcf 构建的 Web 服务器上的服务,wcf 服务托管域模型使用 nhibernate 进行持久性(因此它通过使用列表和集合等接口来感知休眠)

我知道在使用肥皂网络服务时,只共享模式而不共享类型,但我们希望共享类型,因为类型将具有方法、业务逻辑等。

并且由于通信的两端都在我们的控制之下,我们实际上并不需要使用肥皂,但为了所有的清晰和调试、安全性和一般的安心,SOAP 是需要的。

想知道这是否是人们使用的一种方法,以及是否有任何框架可以启用/指导/简化将代理转换回其原始类型的任务。

或者是否有其他可能的方法。

4

3 回答 3

1

Marc 是正确的,您不能在 SOA 架构中共享类型。事实上,在 SOA 中,这是不可取的。

但是您已经决定不需要 SOA,因此您可以根据需要共享类型。使用“添加服务引用”时只需单击“高级”按钮,然后选择要在客户端和服务之间共享的类型集。

当然,这确实将您的客户端和服务紧密地绑定在一起,并且失去了 SOA 的其他好处,但它并不比您使用 COM 更糟糕。

于 2009-08-14T15:47:31.827 回答
0

不能在真正的 SOA 世界中共享类型(例如类)——因为最终,它真正归结为一切都被序列化为 XML 流并通过网络发送。另外——一端可能是 .NET,另一端是 PHP 或 Java——现在我认为你的 Java 客户端不会理解并能够在你的对象上执行 .NET 方法。

SOA 与“对象远程处理”不同——它只是不适合通过网络实际远程处理对象——它发送XML 消息——这就是它所能做的全部。它可以来回发送数据,但不能发送代码。

如果在您的场景中您确实控制了对话的两端,那么您当然可以将所有业务对象打包到一个共享程序集(或多个)中,然后在您的服务器和客户端之间以物理方式共享这些程序集。在这种情况下,您可以在服务器上序列化对象“客户”,发送 XML 消息,然后在客户端,再次将其反序列化为“客户”。但请注意:您发送的只是客户的状态 - 其字段和属性中的值。您并没有真正发送代码 - 恰好在线路的两端都可用。

在这种情况下,很多人所做的是将感兴趣的信息从实际的“客户”对象中提取到通常称为“客户DTO”的“数据传输对象”中,通过使用诸如AutoMapper之类的东西以使其更容易,并且然后他们在线路的另一端创建一个新的 Customer 实例,并将数据从 DTO 复制回“真实”对象。

马克

于 2009-08-14T15:18:41.967 回答
0

有一种在客户端和服务之间共享类型的简单方法,只需在添加服务引用之前向客户端添加对共享类型程序集的引用即可。

您可以在那里找到详细的场景和示例项目:

http://blog.walteralmeida.com/2010/08/wcf-tips-and-tricks-share-types-between-server-and-client.html

于 2010-08-19T10:26:35.973 回答