NHibernate Interceptor澄清(删除/脏)

时间:2012-04-23 11:46:23

标签: nhibernate domain-driven-design ddd-repositories

我可能正在尝试某些事情(糟糕),只是为了看看我想出了什么。 对于初学者,我们以DDD方式构建了一个应用程序 - 我们的意见。该设计是“经典”DDD,这意味着我们拥有聚合根的存储库。 我们有一个基本实体,我们覆盖Equals,GetHashCode等。我们的实体只是逻辑删除,即我们使用IsActive字段。 作为ORM,我们使用NHibernate> 3.

我想尝试的事情:我希望能够使用如下语法从聚合根目录中的列表中删除实体:

aggregateRoot.Entities.Remove(entity);

在持久层中,“entity”(“entity”具有对“aggregateRoot”的反向引用)的默认NHibernate行为是使用“aggregateRoot”列上的NULL更新“entity”。我们实际想做的是:

repository.Delete(entity);

只是将“entity”标记为非活动状态,而“entity”保留在“aggregateRoot”的集合中。

我的想法很可能只是简单的愚蠢(正如我再次说过的那样),但我想尝试教NHibernate“实体”不应该使用对“aggregateRoot”的空引用进行更新,只是让它不活动。为什么?因为我想在需要的地方明确使用存储库。

我要问的是,这是否可以通过NHibernate Interceptor实现;我还没有尝试过,我想优先考虑我的积压工作。

3 个答案:

答案 0 :(得分: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;
  }
}

很抱歉,如果我错过了这一点......

答案 1 :(得分:0)

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

答案 2 :(得分:0)