如何将非规范化值引入Business Objects?

时间:2008-11-18 14:06:27

标签: oop architecture class-design

我有两张桌子。

订单 - 使用列OrderID,OrderStatusID
OrderStatus - 使用列OrderStatusID,描述

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

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

5 个答案:

答案 0 :(得分:2)

通常我更喜欢将查询处理为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;
   }
}

答案 1 :(得分:1)

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

订单属性

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

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

答案 2 :(得分:0)

您可以将SQL select语句与JoinStatus表的Join一起使用,并在每个表中包含您想要的列...

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

My Order对象可能包含状态描述字段(readonly [to non internal classes]),以及任何其他类似字段。

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