我已经对域建模了几天,根本没有考虑持久性,而是专注于域逻辑。现在我准备好持久化我的域对象,其中一些包含 IEnumerable 的子实体。使用 RavenDb,持久性很容易,但是当再次加载我的对象时,所有的 IEnumerables 都是空的。
我意识到这是因为他们根本没有任何属性设置器,而是使用列表作为支持字段。域聚合根的用户可以通过公共方法而不是直接在集合上添加子实体。
private readonly List<VeryImportantPart> _veryImportantParts;
public IEnumerable<VeryImportantPart> VeryImportantParts { get { return _veryImportantParts; } }
还有添加的方法,没什么花哨的……
public void AddVeryImportantPart(VeryImportantPart part)
{
// some logic...
_veryImportantParts.Add(part);
}
我可以通过在我的所有带有支持字段的 IEnumerables 上添加一个私有/受保护的设置器来解决这个问题,但它看起来......嗯......不是超级性感。
private List<VeryImportantPart> _veryImportantParts;
public IEnumerable<VeryImportantPart> VeryImportantParts
{
get { return _veryImportantParts; }
protected set { _veryImportantParts = value.ToList(); }
}
现在 RavenDb json 序列化程序将在加载时再次填充我的对象,但我很好奇是否没有更清洁的方法来执行此操作?
我一直在摆弄JsonContractResolver但还没有找到解决方案......