域模型与实体FW:当在持久性模型中进行拆分是有用的时,是这种情况吗

本文关键字:模型 有用 情况 拆分 FW 实体 持久性 | 更新日期: 2023-09-27 18:20:41

在DDD方法中,我有一个具有丰富行为的领域模型(DM)。假设我有一个根实体,称为Order和相对的LineOrderLineOrder的公开集合需要是IReadOnlyCollection,因为没有任何集合可以任意更改该集合。代码中:

public class Order : AggregateRoot {
    // fields
    private List<LineOrder> lineOrder;
    // ctors
    private Order() {
        this.lineOrder = new List<LineOrder>();
        // other initializations
    }
    // properties
    public IReadOnlyCollection<LineOrder> LineOrder {
        get
        {
            return lineOrder.AsReadOnly();
        }
    }
    // behaviours  
}

到目前为止,一切都很好。但是,当我想保留这个域时,实体框架施加了一些技术限制(即使我有一个值对象、一个无参数构造函数等等,也需要一个密钥),这与DDD方法并不完全匹配。我的另一个限制是:

public class OrderConfiguration : EntityTypeConfiguration<Order>
{
    public OrderConfiguration()
    {
        ToTable("Order");
        HasMany<LineOrder>(m => m.LineOrder); // Exception: Cannot convert from IReadOnlyCollection to ICollection
    }
}

我不能将IReadOnlyCollection强制转换为ICollection(顺便说一句,如果LineOrderICollection,一切都可以!)。

出于我上面表达的原因:在这种情况下,创建一个持久性模型(具有归属缺点:映射DM/PM和反之亦然)是否有用?

有其他选择吗?最重要的是:有没有一种替代方案非常适合DDD方法?

域模型与实体FW:当在持久性模型中进行拆分是有用的时,是这种情况吗

您是否尝试将LineOrder集合声明为protected?EF可以通过这种方式访问,但消费者无法访问。

// properties
protected ICollection<LineOrder> LineOrder { get; set; }

然后,您可以使用以只读方式向最终用户公开此集合

public IReadOnlyCollection<LineOrder> ReadOnlyLineOrder
{
    get
    {
        return LineOrder.ToList().AsReadOnly();
    }
}