これは、ドメイン モデルの設計に関する質問です。
ユーザーとグループを含むドメイン設計の場合、実装する次のインターフェイスがあるとします。
interface IUser
{
string Name{get;}
DateTime DOB {get;}
}
interface IGroup
{
string Name {get;}
bool IsUserInGroup(IUser user); // #1
void IncludeUser(IUser user); // #2
void ExcludeUser(IUser user); // #3
}
interface IUserRepository
{
IUser Create(string name);
IUser GetByName(string name);
void Remove(IUser user);
void Save(IUser user);
}
interface IGroupRepository
{
IGroup Create(string name);
IGroup GetByName(string name);
void Remove(IGroup group);
void Save(IGroup group);
}
ややこしいのは、エンティティ クラス (User、Group) をリポジトリ クラス (UserRepository、GroupRepository) から切り離したまま、#1 #2 と #3 を実装することです。
考慮すべきもう 1 つの技術的事項は、ほとんどの RMDB システムは多対多の関係を実装していないことです。実際には、外部キーを介してユーザーとグループを関連付けるレコードを持つ個別のテーブル (UserGroupAssociation など) が常に存在します。この実装の詳細をドメイン インターフェイスから隠し、メンバー #1 #2 および #3 を介して同等のロジックを公開したいと考えています。
#2 と #3 を呼び出した効果は、問題のグループ オブジェクトが保存される (つまり、リポジトリ オブジェクトの Save() メソッドに渡される) まで保持されません。
普段はどのようにしていますか?