在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
}
到目前为止,这么好。但是当我想要坚持这个域时,我有一些Entity Framework强加的技术限制(即使我有一个值对象,一个无参数构造函数等,也需要一个键),这与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方法的替代方案?
答案 0 :(得分:1)
您是否尝试将LineOrder
集合声明为protected
?这样EF就可以访问,但消费者却没有。
// properties
protected ICollection<LineOrder> LineOrder { get; set; }
然后,您可以通过以下方式以只读方式将此集合公开给最终用户:
public IReadOnlyCollection<LineOrder> ReadOnlyLineOrder
{
get
{
return LineOrder.ToList().AsReadOnly();
}
}