(это написано в предположении, что используется GUID или какой-то первичный ключ, не сгенерированный базой данных)
Также много кода котла, такого как управление соединением и т. Д. ... должны быть перемещены в базовый класс для репозитория.
Если Order является агрегатным корнем, возможно, следует сделать OrderLineRepo приватным для сборки
public class OrderRepository : Repository
{
public void Save(Order order)
{
if(order.IsDirty)
{
//sets up connection if required, command and sql
ICommand command = BuildCommandForSave(order);
command.Execute();
OrderLineRepository orderLineRepo = GetOrderLineRepo();
foreach(OrderLine line in order.OrderLines)
{
orderLineRepo.Save(line);
}
}
}
}
Однако я бы подчеркнул, что это действительно простая наивная реализация, и что я лично использовал бы ORM, такой как nHibernate, для своей персистентности, если бы выполнял DDD, поскольку требования для хорошего хорошо протестированного слоя персистентности нетривиальны
Также предполагается, что функция IsDirty учитывает дочерние элементы - нам также потребуется средство, чтобы увидеть, является ли порядок новым / отредактированным, а не просто грязным