我正在尝试将用户,角色和权限纳入ddd。目前我有一个情况: 1.有权限,角色和用户分开存在。他们可以没有任何联系 2.用户可以分配角色并具有角色,他收集链接的权限
在这种情况下我定义聚合根有问题。角色和权限可以单独管理,因此用户不能成为他们的聚合。角色可以分配给用户(或反向),但用户不是角色的一部分,因为可以没有任何角色。
在任何时候,可以将权限分配给角色(多对多),也可以将角色分配给用户(多对多),但一个用户不能分配两次相同的角色。
我的域名的一些规则: 只有聚合根可以包含将要调度的事件列表 只有聚合根可以拥有存储库
我现在拥有什么
public class Role : AggregateRoot<int>
{
public string Code { get; protected set; }
public string Name { get; protected set; }
public static Role Create(string name, string code) => new Role(name, code);
public Role Modify(string name, string code)
{
this.Name = name;
this.Code = code;
return this;
}
protected Role(string name, string code)
{
this.Name = name;
this.Code = code;
}
protected Role()
{
}
}
public class Permission : AggregateRoot<int>
{
public string Code { get; protected set; }
public string Name { get; protected set; }
public static Permission Create(string name, string code)
=> new Permission(name, code);
public Permission Modify(string name, string code)
{
this.Name = name;
this.Code = code;
return this;
}
protected Permission(string name, string code)
{
this.Name = name;
this.Code = code;
}
protected Permission()
{
}
}
public class User : AggregateRoot<int>
{
public string Name { get; protected set; }
public static User Create(string name) => new User(name);
public virtual ICollection<Credential> Credentials { get; set; }
protected User(string name)
{
this.Name = name;
}
protected User()
{
}
}
通过这种方法,我可以单独管理All,因为它们都是自己的聚合根。如果我想将Role分配给用户,可能我必须创建域服务(访问不同的根)或抛出事件并处理它创建链接。这感觉很糟糕。 其他想法是将用户,角色和权限视为实体,创建不会在db上持久化的聚合根,并在那里执行所有操作。对于这个想法的意见:聚合根的存储库需要使用存储库来操作实体。
你知道应该如何定义它吗?