【问题标题】:Reference actual object or just the object Id?引用实际对象还是仅引用对象 ID?
【发布时间】:2012-03-05 20:51:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    很多 ORM 技术都有“代理”和“延迟加载”的概念,意思是,除非你引用对象,否则它不会加载它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        1. 仅在需要详细信息时才包含其他对象。

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

        3. 如果您必须包含 ID,请确保当您保存回数据库时,您的更新包含一个子句,说明“其中 id=@customerId 和(此处的逻辑确保您的用户实际上可以访问该 customerid 和根对象)李>

        我有 mvcsecurity.codeplex.com 来帮助加密网页上的记录 id 以防止篡改(它也有帮助,但您的查询中仍然应该有一些东西来防止字段篡改,因此攻击者无法添加其他人的客户 id例如_)

        如果有人感兴趣,我将在此处详细介绍 MVC 中的参数篡改: http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=hack-proofing-dotnet-app

        【讨论】:

          【解决方案4】:

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

          但是,如果您的包含对象只需要处理 ID(例如,将其传递给处理 ID 以执行某些操作的不同对象),那么您可以只保留 ID 字段。无需公开整个对象(但请确保您的包含对象不需要了解其他对象的任何信息。)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多