2 か月前に、Scott Millet 著の「Professional ASP.NET Design Patterns」という本を購入しました。これは、デザイン パターンを使用して階層化された Web アプリケーションを構築する方法を学びたかったからです。この本のケーススタディを自分のアプリケーションで使用したので、すべてがセットアップされました。
私が抱えている問題は、集計ルートがわからないことです。
コレクションを作成できるユーザーがいます。ユーザーはコレクションにカテゴリを追加し、カテゴリにキーワードを追加できます。私のデータベースでは次のようになります。
- Users
- PK: UserId
- Collections
- PK: CollectionId
- FK: UserId
- Categories
- PK: CategoryId
- FK: CollectionId
- Keywords
- PK: KeywordId
- FK: CategoryId
ユーザーをコレクションの集約ルートにするのは論理的ではありませんが、カテゴリとキーワードが一緒になってコレクションを形成します。そのため、ユーザーをまだ子を持たない集約ルートにし、コレクションを集約ルートにしました。1 つのコレクションに複数のカテゴリを含めることができ、カテゴリに複数のキーワードを含めることができます。したがって、カテゴリを追加する場合は、次のようにします。
public void CreateCategory(CreateCategoryRequest request)
{
Collection collection = _collectionRepository.FindCollection(request.IdentityToken, request.CollectionName);
Category category = new Category { Collection = collection, CategoryName = request.CategoryName };
ThrowExceptionIfCategoryIsInvalid(category);
collection.AddCategory(category);
_collectionRepository.Add(collection);
_uow.Commit();
}
これは問題なく動作しますが、キーワードを追加する場合は、まずコレクションを取得し、次にキーワードを追加できるカテゴリを取得してからコレクションをコミットする必要があります。
public void CreateKeyword(CreateKeywordRequest request)
{
Collection collection = _collectionRepository.FindCollection(request.IdentityToken, request.CollectionName);
Category category = collection.Categories.Where(c => c.CategoryName == request.CategoryName).FirstOrDefault();
Keyword keyword = new Keyword { Category = category, KeywordName = request.KeywordName, Description = request.KeywordDescription };
category.AddKeyword(keyword);
_collectionRepository.Add(collection);
_uow.Commit();
}
そして、これは正しくないと感じます (そうですか?) どうして、カテゴリをキーワードの集約ルートにするべきだと思いましたか。しかし、別の疑問が生じます。最初のコード例で行ったように、カテゴリ集計を作成するコレクション集計があることはまだ有効ですか? 例: collection.Add(category);