バックグラウンド
私が理解しているように、Unit of Work (UoW) パターンは基本的にトランザクション セマンティクスを提供します。つまり、リポジトリによって永続化された集約のドメインが与えられた場合、UoW クラスを使用すると、ドメインのコンシューマーはリポジトリ メソッドの呼び出しをアトミック操作に登録できます。私たちが持っているとしましょう:
interface IAggregate<TKey> {
TKey Id { get; }
}
interface IRepository<TEntity, in TKey> where TEntity : IAggregate<TKey> {
TEntity Get(TKey id);
void Save(TEntity entity);
void Remove(TEntity entity);
}
interface IUnitOfWork {
void RegisterSave<TEntity>(TEntity entity);
void RegisterRemove<TEntity>(TEntity entity);
void RegisterUnitOfWork(IUnitOfWork uow);
void Commit();
void Rollback();
}
の実装はIRepository
リレーショナル データベースを使用し、 の実装はIUnitOfWork.Commit
単にデータベースとのトランザクションをセットアップし、登録されたすべての操作に対して適切なインスタンスでSave
orを呼び出します。上で概説したことは、Aggregate Root、Repository、および UoW パターン (NHibernate/EF とそのすべての肥大化した栄光にもかかわらず) の標準的で直接的な解釈であると言えます。Remove
IRepository
これまで、私は集約ルート境界の概念を、ある集約から別の集約への参照を、ソース集約のターゲット集約の Id プロパティによってオブジェクト化する必要があるという意味として解釈してきました。例えば:
class User : IAggregate<int> {
int Id { get; private set; }
}
class Blog : IAggregate<int> {
int Id { get; private set; }
int AuthorUserId { get; set; }
}
質問
上記の関心の分離と集約境界の解釈を考えると、トランザクションで集約を作成し、リポジトリで生成された Id を別の集約に保存する必要がある消費者にトランザクション サポートをどのように提供しますか? たとえば、 と を に設定しUser
てBlog
トランザクション的に作成するにはどうすればよいですか?Blog.UserId
User.Id
私はいくつかの回答を思いつきました (コミュニティ wiki とマークされています) が、とにかくここに私の質問を投稿して、フィードバックとより多くの回答を求めています。