【发布时间】:2012-03-05 20:51:20
【问题描述】:
当将整个对象包含为另一个对象的属性或仅包含它的 ID 时,我有一个困惑的问题。似乎如果我包含整个对象,加载包含对象的调用将不必要地加载包含的对象,而我可能只需要引用。什么是属性方法?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 design-patterns
当将整个对象包含为另一个对象的属性或仅包含它的 ID 时,我有一个困惑的问题。似乎如果我包含整个对象,加载包含对象的调用将不必要地加载包含的对象,而我可能只需要引用。什么是属性方法?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 design-patterns
通常总是引用另一个对象。
很多 ORM 技术都有“代理”和“延迟加载”的概念,意思是,除非你引用对象,否则它不会加载它。
【讨论】:
我更喜欢包含对象本身,因为一个对象实际上与另一个实际对象有关系——对象 ID 只是一个实现细节。处理不必要调用的问题,请查看“lazy loading”。
【讨论】:
仅在需要详细信息时才包含其他对象。
在 MVC 中理想地使用 ViewModel 而不是您的实体。您的 ViewModel 仅包含它需要的内容,例如 OrderEditViewModel 将包含一个 customerid,除非您想显示自定义名称,在这种情况下您将包含来自 customer 的字段。有些人建议您将对象展平为视图模型,因此您没有 OrderEditViewModel.Customer.CustomerId 而是 ORderEditViewModel.CustomerId。 Automapper 可以帮助您做到这一点(以及 valueinjecter - 注意拼写)
我有 mvcsecurity.codeplex.com 来帮助加密网页上的记录 id 以防止篡改(它也有帮助,但您的查询中仍然应该有一些东西来防止字段篡改,因此攻击者无法添加其他人的客户 id例如_)
如果有人感兴趣,我将在此处详细介绍 MVC 中的参数篡改: http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=hack-proofing-dotnet-app
【讨论】:
我的建议是始终考虑设计而不是性能。性能可以调整,但设计不能。因此,如果这两个对象具有需要聚合/组合的那种关系,则应该这样做。
但是,如果您的包含对象只需要处理 ID(例如,将其传递给处理 ID 以执行某些操作的不同对象),那么您可以只保留 ID 字段。无需公开整个对象(但请确保您的包含对象不需要了解其他对象的任何信息。)。
【讨论】: