【问题标题】:How do you bring Denormalized Values Into your Business Objects?您如何将非规范化值带入您的业务对象?
【发布时间】:2010-09-22 20:45:49
【问题描述】:

我有两张桌子。

订单 - 包含 OrderID、OrderStatusID 列
OrderStatus - 包含列 OrderStatusID、描述

我有一个订单对象,它调用数据库并填充其属性以在我的代码中使用。现在我可以访问 Order.OrderStatusID,但在我的应用程序中,我确实需要访问“描述”字段。

您如何通过良好的 OO 设计优雅地处理这个问题?

【问题讨论】:

    标签: oop architecture class-design


    【解决方案1】:

    您可以将 SQL 选择语句与 OrderStatus 表的连接一起使用,并从每个表中包含您想要的列...

    Select O.OrderId, O.OrderStatusId, S.Descriptiuon
    From Order O
        Join OrderStatus S 
            On S.OrderStatusId = O.OrderStatusId
    Where OrderId = 23 -- or whatever
    

    【讨论】:

    • 我了解如何从数据库中获取数据集,但我想知道它应该如何映射到我的对象。当我填充 Order 对象时,如果能够访问 Order Status 作为描述而不是外部整数值,那就太好了。
    • 当您说“访问它”时,您的意思是“读取”字符串值吗? select 语句会将字符串值带入您的对象...当然,您的对象需要有一个属性来保存它...我不明白您的担忧是什么吗?
    • 即Order 类应该同时具有 orderStatusId 属性(作为 int)和 orderStatus 属性(作为字符串)
    【解决方案2】:

    Order 和 OrderStatus 之间是一对一的关系吗?我想这取决于你为什么会有一个 OrderStatus 表的目的,因为我认为实际上不需要单独的 OrderStatus 表?

    基本上,该表为您提供的只是更改订单状态描述的能力。然后,您将在代码中根据预定义的 OrderStatusID(来自种子数据?)或通过描述编写代码。如果是这种情况,那么为什么不让 Order 表包含一个 OrderStatus 列,它是一个整数并且可以映射到一个枚举类型?

    【讨论】:

      【解决方案3】:

      我当前使用的系统会创建另一个业务对象的实例并设置 ID。然后在使用另一个业务对象时检索它。例如

      订单属性

      int OrderId = 5
      int OrderStatusId = 3
      OrderStatus OrderStatus_ref
      {
      get
      {
          if OrderStatus_ref == null
              OrderStatus_ref = new OrderStatus(OrderStatusId)
          return OrderStatus_ref
      }
      }
      

      无论如何,这是一般的想法。

      【讨论】:

        【解决方案4】:

        我的 Order 对象可能包括状态描述字段(只读 [对非内部类]),以及任何其他类似字段。

        在后台,我的 getter(例如 LoadByID、LoadAll 等)可能会使用包含所有这些描述性字段的视图(例如 OrdersView)。这些描述字段是只读的,因此您不会意外设置这些字段,以为您可以将更改保存到数据库中。

        【讨论】:

          【解决方案5】:

          通常我更喜欢将查找处理为Value objects。我也用Null Object pattern

          public class Order {
            private int statusID;
          
            public OrderStatus Status {
              get {
                return OrderStatus.Resolve(statusID);
              }
              set {
                statusID = value != null ? value.ID : null;
              }
            }
          }
          
          public class OrderStatus {
             public static OrderStatus Resolve(int statusID)
             {
               OrderStatus status = null;
               // read from cache or DB
               ...
               // if not found return Null object
               if (status == null)
                 status = new OrderStatus(null, string.Empty);
               return status;
             }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-01-07
            • 2020-05-06
            • 1970-01-01
            • 1970-01-01
            • 2010-09-08
            • 2011-06-08
            • 2018-04-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多