Я изо всех сил пытаюсь найти правильный дизайн, чтобы избежать ссылки на репозиторий из объекта... Допустим, у меня есть классические классы Customer
и Order
, например:
public class Customer {
...
public IEnumerable<Order> Orders { get; set; }
}
public class Order {
...
public Customer Customer { get; set; }
public IEnumerable<OrderItem> OrderItems { get; set; }
public void Submit() {
...
}
}
public class OrderItem {
public Product Product { get; set; }
public decimal SellingPrice { get; set; }
}
Теперь предположим, что цена продажи Товара по какой-то причине зависит от того, был ли Товар также куплен (или нет) по предыдущему Заказу, количества товаров в текущем заказе и предыдущем заказе и т. д. Я мог бы сделать так:
public void Submit() {
Order lastOrder = this.Customer.Orders.LastOrDefault();
CalculatePrice(lastOrder);
но это загрузит весь список заказов, когда мне действительно нужен только последний!
То, что я хотел бы сделать, это что-то вроде этого:
public void Submit() {
Order lastOrder = _orderRepository.GetLastOrderFor(Customer);
CalculatePrice(lastOrder);
Но я понимаю, что ссылка на OrderRepository
в домене — это плохой DDD. Итак, что мне делать? Должен ли я помещать Submit() в другое место, кроме домена? Если да, то где вы предлагаете?