在DDD中有没有办法处理没有ORM框架的嵌套集合?
本文关键字:框架 ORM 嵌套 集合 DDD 有没有 处理 | 更新日期: 2023-09-27 18:05:24
我对通过纯ADO处理业务对象中的嵌套集合感到困惑。. NET解决方案,没有第三方ORM框架,如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的嵌套集合对象?
我认为有办法建立秩序。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
是一个实际的域命令,表明发生了一些新的事情。
只是一些想法:)