我已经阅读了一些关于创建无状态网站的书籍,我已经阅读了一些关于有状态客户端应用程序的书籍,但是当你必须将两者结合起来时会出现很多复杂性。我们有一个Flex应用程序需要通过.NET服务将数据持久化到数据库。要记住的事情是: - 并发(乐观/悲观) - 性能:Flex需要加载大量数据,因此通常需要延迟加载。 - 您是否使用Dto在服务器和客户端之间传输数据?
我会告诉你我们产品的历史。我们从一开始就使用SubSonic作为o / r映射器。 SubSonic对象转换为由我们编写的dto,并将这些dto传输到客户端。客户端dto被转换为域模型。如果客户端需要保存域模型对象,则将其转换回dto并发送到服务器。服务器端将dto转换为亚音速对象并保存到数据库中。
现在,前一段时间,我们需要.NET服务器端的域模型...所以现在我们在服务器端有三个模型,亚音速模型,dto模型和域模型。 dto模型更简单,更像数据库,域模型有更多的逻辑。它变得复杂......我们现在必须将AS3域模型代码与C#域模型代码同步。如果我们可以再做一次(有时间重构)我认为我们不再使用dto了,而是在客户端和服务器之间传输域模型。问题是这是否切合实际。 Dto是简单的物体,很容易转移。域模型对象可能非常复杂。
是否有关于如何为这类应用程序创建架构的书籍?有很多经验的人写的书吗?你有这方面的经验吗?
答案 0 :(得分:1)
现实情况是,在客户端和服务器之间共享对象非常复杂。以下是实现这一目标所需要的:
简单/不可扩展的方式:
从MarshalByrefObject
继承对象的所有。如果在服务器上创建对象A并将其发送到客户端,则对该对象的任何客户端修改都将自动转发到服务器。
虽然这听起来像是一个完美的解决方案,但它有两个主要问题:
可扩展/困难的方式:
不使用MarshalByRefObject
,而是使用DataContract/Serializable
个对象。但是:
但您确实希望服务器将对象A 和对象C 视为相同。遗憾的是,CLR无法执行此操作,因此您需要对象合并才能同时位于客户端和服务器上。
对象合并将包含模型中所有对象的字典,并知道如何将两个实例标识为相同,并合并来自接收端的任何值。例如,如果客户端已在内存中具有对象C,并从服务器接收更新的副本,则它将复制这些值。
不幸的是,这也充满了问题,因为您需要确保正确保留对象引用。您不能盲目地更新对象上的所有属性,因为该对象可能具有对其他对象的现有引用,这反过来可能需要它们自己的合并。除此之外,您还需要跟踪列表或词典中包含的已添加/已删除对象。
我在我自己的框架中添加了n层支持,所以我现在正在进行相同的练习(我正在采用“可扩展/硬”路线)。幸运的是,我有很多支持基础设施来协助识别,合并等。如果你从头开始,这将是一项重要的工作。
P.S。将延迟加载代理添加到混合中(我正在使用Nhibernate),甚至更多有趣...
答案 1 :(得分:0)
去Fowler阅读任何内容,特别是他的设计模式(特别是汇编模式以及你为什么需要你已经在做的事情)