0

我可能正在尝试一些东西(坏的),只是想看看我想出了什么。对于初学者,我们以 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 拦截器实现;我还没有尝试过它们,我想优先考虑我的积压。

4

3 回答 3

1

你为什么不在你的实体上实现一个 Delete 方法呢?您可以将其隐藏在核心界面后面。优点是完全不了解持久性的实现,不需要 NH 存在。

class Root
{
  // ...
  public void Remove(Entity entity)
  {
    IRootManaged managed = (IRootManaged)entity
    managed.Delete();
  }
}

class Entity : IRootManaged
{
  // ...
  public bool IsDeleted { get; private set; }

  public void IRootManaged.Delete()
  {
    this.IsDeleted = true;
  }
}

对不起,如果我错过了这里的重点......

于 2012-04-23T12:15:42.740 回答
0

看看这个:http ://ayende.com/blog/4157/avoid-soft-deletes

于 2012-04-25T19:07:37.553 回答
0

在经典的 DDD 中,aggregateRoot.Entities.Remove(entity);无论如何都是不好的做法。您最好在根实体上创建一个方法,例如RemoveEntity(Entity e),然后您将封装删除机制,您将在其中将 Entity.IsActive 设置为 false。

于 2012-04-23T12:41:46.080 回答