0

私は自分が思いついたものを見るために、何か(悪い)を試みている途中かもしれません。手始めに、私たちはDDD方式でアプリケーションを構築しました-私たちの意見です。デザインは「クラシック」DDDです。つまり、集約ルート用のリポジトリがあります。Equals、GetHashCodeなどをオーバーライドするベースエンティティがあります。エンティティは論理的に削除されるだけです。つまり、IsActiveフィールドを使用します。ORMとして、NHibernate>3を使用します。

私が試したいこと:次のような構文で、集約ルート内のリストからエンティティを削除できるようにしたいと思います。

aggregateRoot.Entities.Remove(entity);

永続層では、「entity」のデフォルトのNHibernateの動作(「entity」には「aggregateRoot」への後方参照があります)は、「aggregateRoot」列の「entity」をNULLで更新することです。私たちが実際にやりたいことはこれです:

repository.Delete(entity);

これは、「entity」が「aggregateRoot」のコレクションに残っている間、「entity」を非アクティブとしてマークするだけです。

おそらく私の考えは(もう一度言ったように)単純に愚かですが、NHibernateに「エンティティ」を「aggregateRoot」へのnull参照で更新してはならず、非アクティブにするだけであることを教えたいと思います。なんで?必要な場所でリポジトリを明示的に使用したいからです。

私が求めているのは、これがNHibernateInterceptorsを介して達成可能かどうかです。まだ試していませんので、バックログを優先したいと思います。

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

古典的な DDD では、aggregateRoot.Entities.Remove(entity);とにかく悪い習慣です。たとえば、ルート エンティティにメソッドを作成することをお勧めします。そこで、Entity.IsActive を false に設定する削除RemoveEntity(Entity e)メカニズムをカプセル化します。

于 2012-04-23T12:41:46.080 に答える
0

これを見てください:http://ayende.com/blog/4157/void-soft-deletes

于 2012-04-25T19:07:37.553 に答える