引用实际对象或只是对象Id?

时间:2012-03-05 20:51:21

标签: asp.net-mvc asp.net-mvc-3 design-patterns

我有这个问题,混淆何时将整个对象包含为另一个对象的属性,或仅包含其ID。似乎如果我包含整个对象,加载包含对象的调用将不必要地加载包含的对象,当我可能只需要引用时。什么是财产方法?

4 个答案:

答案 0 :(得分:2)

通常总是引用另一个对象。

许多ORM技术都有“代理”和“延迟加载”的概念,这意味着,除非您引用该对象,否则它不会加载它。

答案 1 :(得分:2)

我更喜欢包含对象本身,因为一个对象实际上与另一个实际对象有关系 - 对象ID只是一个实现细节。要处理不必要的电话问题,请查看“lazy loading”。

答案 2 :(得分:2)

  1. 如果您需要详细信息,请仅包含其他对象。

  2. MVC中的
  3. 理想情况下使用ViewModel而不是您的实体。您的ViewModel仅包含它所需的内容,因此例如OrderEditViewModel将包含customerid,除非您要显示自定义名称,在这种情况下,您将包含来自customer的字段。有些人建议您将对象展平为视图模型,因此您没有OrderEditViewModel.Customer.CustomerId,而是ORderEditViewModel.CustomerId。 Automapper可以帮助你做到这一点(以及价值注意 - 注意拼写)

  4. 如果您必须包含ID,请确保在保存回数据库时,您的更新中包含一个条款,说'where id = @ customerId and(逻辑此处以确保您的用户实际上可以访问该customerid和root对象)
  5. 我有mvcsecurity.codeplex.com来帮助加密网页上的记录ID以防止篡改(它有帮助但你仍然应该在你的查询中有一些东西来防止现场篡改,所以攻击者无法添加其他人的客户ID例如_)

    如果有兴趣的话,我会更多地参与MVC中的参数篡改: http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=hack-proofing-dotnet-app

答案 3 :(得分:1)

我的建议是始终考虑设计而不是性能。性能可以调整,但设计不能。因此,如果两个对象具有需要聚合/组合的那种关系,那么您应该这样做。

但是,如果您的包含对象只需要处理ID(例如,将其传递给处理ID以执行某些操作的其他对象),那么您只能保留ID字段。不需要公开整个对象(但要确保包含的对象不需要知道关于另一个对象的任何信息。)。