我读过关于创建无状态的网站一些书,我读过一些关于状态的客户端应用,但很多复杂的来当你有两个结合一起。 我们需要通过.NET服务持久化数据到数据库的Flex应用程序。 事情要记住的是: - 并发(乐观/悲观) - 性能:弹性需要大量的数据加载,从而延迟加载往往是必要的。 - 您是否使用DTO的转院到服务器和客户端之间的数据?
我会告诉你我们的产品的历史。 我们从一开始就为AO / R映射使用亚音速。 亚音速对象转换为DTO的真实写我们这些DTO的传送到客户端。 客户方的转换到域模型的DTO。 如果客户方的域模型对象需要被保存,它被转换回DTO并传送到服务器。 服务器端的DTO转换为亚音速对象,并保存到数据库中。
现在,前一段时间,我们需要在.NET服务器端的领域模型......所以现在我们有这样三种模式在服务器端,亚音速模式,DTO模式和领域模型。 该DTO模式更加简单,类似于数据库的更多,领域模型有更多的逻辑。 它变得复杂。我们现在必须同步与C#的域模型的代码AS3域模型的代码。 如果我们能再次做到这一点(的获取时间来重构),我想我们不会使用DTO的了,但客户端和服务器之间传输的域模型。 问题是,如果这是现实。 DTO的是简单对象,以便容易转移。 领域模型对象可以是非常复杂的。
是否有关于如何为这些类型的应用程序创建一个架构的书? 书籍软件写的人,有很多的经验吗? 你有这方面的经验?
现实情况是,客户端和服务器之间共享的对象是相当复杂的。 下面是你需要使它发生的事情:
最简单的/非可扩展的方式:
继承所有从你的对象MarshalByrefObject
。 如果您在服务器上创建对象A,并将其发送给客户端,任何客户端修改的对象将被自动转发到服务器。
虽然这听起来像是一个完美的解决方案,它有两个主要问题:
- 客户端和服务器紧密结合.NET(再见Web服务)
- 它可以是一个噩梦般的表现。 所有的方法/属性的访问将被转发到服务器。 如果你选择这条路线,你的对象应该被设计为矮胖通话,不健谈的人。
可扩展的/硬的方式:
而不是使用的MarshalByRefObject
,你可以使用DataContract/Serializable
对象。 然而:
- 如果您在服务器上创建对象A,并将其发送给客户端,客户端将接收对象的副本 (我们称之为对象B)
- 当您发送对象B返回给服务器,服务器将接收对象B的副本 (我们称之为对象C)
但你真的希望服务器处理的对象A和对象C一样。 不幸的是,CLR不能做到这一点,所以你需要一个对象合并坐在客户端和服务器上。
对象合并,将包含在模型中的所有对象的字典,并知道如何识别两个实例为相同,并从接收端合并的任何值。 举例来说,如果客户端已经在内存中的对象C,并从服务器接收到更新的副本,它会拷贝过来的值。
不幸的是,这也是充满了问题,因为你需要确保对象引用是否正确保存。 你不能只是一味的对象上更新所有的属性,因为对象可能有其他对象,这反过来又可能需要自己的合并现有的引用。 在这一切之上,你还需要跟踪包含在列表或字典添加/删除对象。
我加入n层的支持,我自己的框架,所以我要通过同样的练习,现在(我走的是“可扩展/硬”路由)。 幸运的是,我有很多就地以协助鉴定,合并等,如果你是从头开始的配套基础设施,这将是一个显著的作品。
PS添加延迟加载代理到混合(我使用NHibernate的),它会变得更加有趣......
去了福勒,particularily他设计图案的东西读什么(尤其是组装模式,以及为什么需要你已经做什么)
福勒的格局对企业应用架构