域模型与实体FW:当在持久性模型中进行拆分是有用的时,是这种情况吗
本文关键字:模型 有用 情况 拆分 FW 实体 持久性 | 更新日期: 2023-09-27 18:20:41
在DDD方法中,我有一个具有丰富行为的领域模型(DM)。假设我有一个根实体,称为Order
和相对的LineOrder
。LineOrder
的公开集合需要是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
(顺便说一句,如果LineOrder
是ICollection
,一切都可以!)。
出于我上面表达的原因:在这种情况下,创建一个持久性模型(具有归属缺点:映射DM/PM和反之亦然)是否有用?
有其他选择吗?最重要的是:有没有一种替代方案非常适合DDD方法?
您是否尝试将LineOrder
集合声明为protected
?EF可以通过这种方式访问,但消费者无法访问。
// properties
protected ICollection<LineOrder> LineOrder { get; set; }
然后,您可以使用以只读方式向最终用户公开此集合
public IReadOnlyCollection<LineOrder> ReadOnlyLineOrder
{
get
{
return LineOrder.ToList().AsReadOnly();
}
}