Как вы привносите денормализованные значения в ваши бизнес-объекты? - PullRequest
0 голосов
/ 18 ноября 2008

У меня есть две таблицы.

Заказ - с колонками OrderID, OrderStatusID
OrderStatus - с колонками OrderStatusID, описание

У меня есть объект заказа, который вызывает базу данных и заполняет ее свойства для использования в моем коде. Сейчас у меня есть доступ к Order.OrderStatusID, но в моем приложении мне действительно нужен доступ к полю «Описание».

Как вы справляетесь с этим элегантно с хорошим дизайном OO?

Ответы [ 5 ]

2 голосов
/ 18 ноября 2008

Обычно я предпочитаю обрабатывать поиски как Значения объектов . Я также использую 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 голос
/ 18 ноября 2008

Система, с которой я сейчас работаю, создает экземпляр другого бизнес-объекта и устанавливает Id. Другой бизнес-объект затем извлекается при его использовании. например,

Заказать свойства

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

Так или иначе, это общая идея.

0 голосов
/ 18 ноября 2008

Объект My Order, вероятно, будет включать в себя поле описания состояния (только для чтения (не для внутренних классов)), а также любые другие подобные поля.

Под капотом мои получатели (например, LoadByID, LoadAll и т. Д.), Вероятно, будут использовать View (например, OrdersView), который содержит все эти описательные поля. Эти поля описания доступны только для чтения, поэтому вы не можете случайно установить эти поля, думая, что вы можете сохранить изменения в базе данных.

0 голосов
/ 18 ноября 2008

Это отношение один к одному между Order и OrderStatus? Я думаю, это зависит от цели, почему у вас будет таблица OrderStatus, так как я бы сказал, что на самом деле нет необходимости в отдельной таблице OrderStatus?

По сути, все, что дает вам эта таблица, - это возможность изменить описание статуса заказа. Изнутри кода вы затем будете писать код в соответствии с предопределенным OrderStatusID (из начальных данных?) Или через описание. Если это так, то почему бы не иметь таблицу Order, содержащую столбец OrderStatus, который является целым числом и который может отображаться в тип enum?

0 голосов
/ 18 ноября 2008

Вы можете использовать оператор выбора 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
...