域驱动设计和具有角色和权限的用户

时间:2018-04-17 11:19:18

标签: authorization domain-driven-design aggregateroot

我正在尝试将用户,角色和权限纳入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上持久化的聚合根,并在那里执行所有操作。对于这个想法的意见:聚合根的存储库需要使用存储库来操作实体。

你知道应该如何定义它吗?

0 个答案:

没有答案