2010-08-02 5 views
0

У меня есть несколько бизнес-классов, таких как Address, Product, Order, OrderLine. В этом случае у меня есть вопрос о моем классе Order и о том, как он должен быть обновлен в репозитории.Что такое хорошая практика с объектами репозитория и бизнеса?

Класс Order может иметь более 1 OrderLine. Класс выглядит примерно следующим образом:

class Order { 
    private List<OrderLine> orderLines; 

    public Address CustomerAddress { get; set; } 
    public Address DeliveryAddress { get; set; } 

    public void Add(OrderLine line) { 
    // stuff to add order line. 
    } 

    public void Remove(int index) { 
    // stuff to remove order line by index. 
    } 
} 

Когда нужно получить ордер, я могу сделать следующее:

Order myOrder = Orders.Get(5); // Gets the order with ID 5 from repository. 

Теперь я могу добавить или удалить строки заказа по мере необходимости и изменить CustomerAddress или DeliveryAddress.

Когда я хочу, чтобы обновить измененную заказ я могу сделать:

bool updated = order.Update(); 

Что внутренне вызывает метод Update Распоряжений хранилище как:

public bool Update() { 
    return Orders.Update(this); // Let repository handle updating of this order. 
} 

Теперь предположим, что заказ я уже получил с помощью Orders.Get (5) имеет 10 строк порядка, и я изменил 1 строку заказа, добавил 1 строку заказа и удалил 1 строку заказа.

Предположим, что я назначен другой адрес доставки:

myOrder.DeliveryAddress = Addresses.Get(64); // Get address with ID 64 from repository and assign it to order. 

Что должно произойти в методе Update ордена репозитария?

Следует ли обновить весь заказ, включая все строки заказа, удалить удаленную строку заказа, сохранить добавленную строку заказа и обновить строку заказа, которая была изменена?

Я немного потерялся здесь, так как он становится очень сложным, когда все эти внутренние элементы (Address and OrderLines) должны быть обновлены, вставлены или удалены.

У кого-нибудь есть предложения?

Большое спасибо заранее :)

ответ

0

Если следовать Domain Driven Design школу, хотя, вы бы участвовать модель в агрегатах, где каждый агрегат будет состоит из ряда связанных классов, заказ, OrderLine , и так далее. В каждом агрегате один класс обозначается как совокупный корень, например. Заказ и берет на себя ответственность за управление целостностью модели всех объектов в совокупности. В репозиториях DDD действуют агрегаты объектов, а не отдельные объекты. Точно, как участвовать в модели в совокупности может быть сложно, но как только вы это сделаете, ответственность станет понятной.

Смежные вопросы