2009-10-28 90 views
0

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

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

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

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

回答

1

现实情况是,客户端和之间共享对象服务器相当复杂。下面是你需要使它发生什么:

易/非可扩展的方式:

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

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

  1. 客户端和服务器紧密结合.NET(再见Web服务)
  2. 它可以是一个噩梦般的表现。所有的方法/财产访问将被转发到服务器。如果你选择这条路线,你的对象应该设计为粗笨的呼叫,而不是健谈的呼叫。

可扩展/硬办法:

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

  • 如果创建对象在服务器上,并将其发送给客户端, 客户端将接收对象的副本(我们称之为对象B
  • 当您发送对象B回服务器,服务器将接收对象B的 副本(姑且称之为对象C

但是你真的想要服务器对待对象A对象C作为相同。不幸的是,CLR无法做到这一点,所以你需要一个对象合并坐在客户端和服务器上。

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

不幸的是,这也充满了问题,因为你需要确保正确保存对象引用。您不能盲目地更新对象上的所有属性,因为该对象可能具有对其他对象的现有引用,这反过来又可能需要它们自己的合并。除此之外,您还需要跟踪列表或词典中包含的添加/删除的对象。我正在为我自己的框架添加n层支持,所以我现在正在经历同样的练习(我正在采用“可伸缩/硬”路线)。幸运的是,我有很多辅助基础设施就地协助识别,合并等。如果您从头开始,这将是一项重要的工作。

P.S.添加延迟加载代理到混合(我使用Nhibernate),它甚至得到更多有趣...

+0

伟大的信息,thx。我们使用延迟加载。对象合并似乎是一个有趣的想法,但要实现它... MarshalByrefObject也很有趣,但这确实是一个性能噩梦。我们经常使用客户端的保存按钮。它有优点和缺点......奇怪的是,我无法在这个复杂的问题上找到很多信息。谢谢! – 2009-11-02 22:17:08

0

转到福勒读什么,particularily他的设计模式的东西(尤其是组装模式,以及为什么需要你已经做什么)

Fowler's Patterns Of Enterprise Application Architecture

+0

已经读过它,理论上它都听起来不错,但实际上它是别的。假设我想阅读一本试图在我的项目中实施PoEAA的人的书。 – 2009-10-28 13:56:07