有没有办法在 DDD 中处理没有 ORM 框架的嵌套集合?

Is there a way to handle nested collection without ORM framework in DDD?

我对通过没有第 3 方 ORM 框架的纯 ADO.NET 解决方案处理业务对象中的嵌套集合感到困惑,例如 AutoMapper/NHibernate/EF。

请考虑以下场景:

//SalesOrder
public class SalesOrder
{
    ICollection<IOrderItem> OrderLines { get; set; }
}

如果我们像这样通过其存储库对象从数据库中检索 SalesOrder 实体,

//Retrieve entity via repository object
ISalesOrderRepository repo = new SalesOrderRepository(DbContext);
ISalesOrder order1 = repo.GetOrderByCustomerPo("TN-2202-01");

我们可以使用SQL语句从数据库中查询数据并将数据填充到SalesOrder实体的相应属性中。

但是如何初始化order1.OrderLines的嵌套集合对象呢?

我认为有一种方法可以通过这样的代理模式构建 order1.OrderLines:

public ICollection<IOrderItem> OrderItems
{
    get 
    {
        if(_orderItems == null)
        {
            IOrderItemLazyLoadingProxy lzProxy = new OrderItemLazyLoadingProxy(this);
            _orderItems = lzProxy.Load();
            return _orderItems;
        }
    }
}

我对上述域对象直接耦合或依赖代理对象的实现感到困惑。

所以我想知道是否有一种方法可以处理聚合根对象中的嵌套集合透明性?

谢谢。

您的域对象应该持久性无知。他们不应该直接关注持久性问题,但你仍然应该务实。

存储库负责加载整个聚合,因此您的 SalesOrderRepository 也应该加载项目。您可以按照以下方式进行操作:

public class SalesOrder
{
    private readonly List<SalesOrderItem> _items = new List<SalesOrderItem>();

    public IEnumerable<SalesOrderItem> Items
    {
        get { return new ReadOnlyCollection<SalesOrderItem>(_items); }
    }

    public void AddItem(string product, decimal price)
    {
        OnAddItem(new SalesOrderItem(product, price));
    }

    public void OnAddItem(SalesOrderItem item)
    {
        _items.Add(item);
    }
}

您的存储库将获取项目日期并实例化它们。 OnAddItem 用于历史数据,仅用于填充内部列表,而 AddItem 是一个实际的域命令,表示发生了新的事情。

一些想法:)