如何在客户端 - 服务器应用程序中解决状态无状态?

时间:2009-10-28 10:08:22

标签: flex architecture domain-driven-design client-server

我已经阅读了一些关于创建无状态网站的书籍,我已经阅读了一些关于有状态客户端应用程序的书籍,但是当你必须将两者结合起来时会出现很多复杂性。我们有一个Flex应用程序需要通过.NET服务将数据持久化到数据库。要记住的事情是: - 并发(乐观/悲观) - 性能:Flex需要加载大量数据,因此通常需要延迟加载。 - 您是否使用Dto在服务器和客户端之间传输数据?

我会告诉你我们产品的历史。我们从一开始就使用SubSonic作为o / r映射器。 SubSonic对象转换为由我们编写的dto,并将这些dto传输到客户端。客户端dto被转换为域模型。如果客户端需要保存域模型对象,则将其转换回dto并发送到服务器。服务器端将dto转换为亚音速对象并保存到数据库中。

现在,前一段时间,我们需要.NET服务器端的域模型...所以现在我们在服务器端有三个模型,亚音速模型,dto模型和域模型。 dto模型更简单,更像数据库,域模型有更多的逻辑。它变得复杂......我们现在必须将AS3域模型代码与C#域模型代码同步。如果我们可以再做一次(有时间重构)我认为我们不再使用dto了,而是在客户端和服务器之间传输域模型。问题是这是否切合实际。 Dto是简单的物体,很容易转移。域模型对象可能非常复杂。

是否有关于如何为这类应用程序创建架构的书籍?有很多经验的人写的书吗?你有这方面的经验吗?

2 个答案:

答案 0 :(得分:1)

现实情况是,在客户端和服务器之间共享对象非常复杂。以下是实现这一目标所需要的:

简单/不可扩展的方式:

MarshalByrefObject继承对象的所有。如果在服务器上创建对象A并将其发送到客户端,则对该对象的任何客户端修改都将自动转发到服务器。

虽然这听起来像是一个完美的解决方案,但它有两个主要问题:

  1. 客户端和服务器与.NET(再见Web服务)紧密结合
  2. 这可能是一场表演噩梦。所有方法/属性访问都将转发到服务器。如果你选择这条路线,那么你的对象应该设计用于粗略的呼叫,而不是繁琐的呼叫。
  3. 可扩展/困难的方式:

    不使用MarshalByRefObject,而是使用DataContract/Serializable个对象。但是:

    • 如果您在服务器上创建对象A ,并将其发送到客户端, 客户端将收到对象的副本(我们称之为对象B
    • 当您将对象B 发送回服务器时,服务器将收到一个 对象B的 copy (我们称之为对象C

    但您确实希望服务器将对象A 对象C 视为相同。遗憾的是,CLR无法执行此操作,因此您需要对象合并才能同时位于客户端和服务器上。

    对象合并将包含模型中所有对象的字典,并知道如何将两个实例标识为相同,并合并来自接收端的任何值。例如,如果客户端已在内存中具有对象C,并从服务器接收更新的副本,则它将复制这些值。

    不幸的是,这也充满了问题,因为您需要确保正确保留对象引用。您不能盲目地更新对象上的所有属性,因为该对象可能具有对其他对象的现有引用,这反过来可能需要它们自己的合并。除此之外,您还需要跟踪列表或词典中包含的已添加/已删除对象。

    我在我自己的框架中添加了n层支持,所以我现在正在进行相同的练习(我正在采用“可扩展/硬”路线)。幸运的是,我有很多支持基础设施来协助识别,合并等。如果你从头开始,这将是一项重要的工作。

    P.S。将延迟加载代理添加到混合中(我正在使用Nhibernate),甚至更多有趣...

答案 1 :(得分:0)

去Fowler阅读任何内容,特别是他的设计模式(特别是汇编模式以及你为什么需要你已经在做的事情)

Fowler's Patterns Of Enterprise Application Architecture