0

我有两张桌子。

订单 - 包含列 OrderID、OrderStatusID
OrderStatus - 包含列 OrderStatusID、说明

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

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

4

5 回答 5

2

通常我更喜欢将查找作为值对象来处理。我也使用空对象模式

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;
   }
}
于 2008-11-18T14:39:21.357 回答
1

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

订单属性

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

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

于 2008-11-18T14:27:34.860 回答
0

您可以将 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
于 2008-11-18T14:17:12.197 回答
0

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

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

于 2008-11-18T14:18:10.947 回答
0

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

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

于 2008-11-18T14:29:44.513 回答