我可能正在尝试一些东西(坏的),只是想看看我想出了什么。对于初学者,我们以 DDD 方式构建了一个应用程序——我们的意见。该设计是“经典” DDD,这意味着我们有聚合根的存储库。我们确实有一个基础实体,我们在其中覆盖 Equals、GetHashCode 等。我们的实体只是逻辑删除,即我们使用 IsActive 字段。作为 ORM,我们使用 NHibernate >3。
我想尝试的事情:我希望能够使用如下语法从聚合根内的列表中删除一个实体:
aggregateRoot.Entities.Remove(entity);
在持久层中,“entity”的默认 NHibernate 行为(“entity”具有对“aggregateRoot”的反向引用)是在“aggregateRoot”列上使用 NULL 更新“entity”。我们真正想做的是:
repository.Delete(entity);
它只是将“实体”标记为不活动,而“实体”仍保留在“aggregateRoot”的集合中。
很可能我的想法很愚蠢(正如我再次说过的那样),但我想尝试教 NHibernate 不应该使用对“aggregateRoot”的空引用来更新“实体”,只需使其处于非活动状态。为什么?因为我想在需要的地方明确使用存储库。
我要问的是这是否可以通过 NHibernate 拦截器实现;我还没有尝试过它们,我想优先考虑我的积压。