这是一个关于领域模型设计的问题。
假设对于涉及用户和组的域设计,我们有以下接口要实现:
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);
}
棘手的一点是实现 #1 #2 和 #3,同时保持实体类(用户、组)与存储库类(用户存储库、组存储库)分离。
另一个需要考虑的技术问题是大多数 RMDB 系统不实现多对多关系,并且在实践中总是有一个单独的表(例如,UserGroupAssociation)来记录每个记录通过外键关联一个用户和一个组。我想从域接口中隐藏这个实现细节,并通过成员 #1 #2 和 #3 公开等效逻辑。
调用#2 和#3 的效果不应该持续到有问题的组对象被保存(即传递给存储库对象的 Save() 方法)
你通常是怎么做的?