DDD / CQRS,实体有权访问Query,Command?

时间:2013-09-23 15:28:52

标签: domain-driven-design cqrs

public class PageRoleService
{
    public void SetRoles(Page page, User activeUser)
    {
        var rb = page.Project.ProjectType.GetRoleFor(activeUser.UserType);

        page.RolesForPage.Add(activeUser, rb);
        var managers = GetAllManagersOf(activeUser);
        foreach (var m in managers)
        {
            page.RolesForPage.Add(m, rb);
        }
    }
}

public class Project : Entity
{
    public ProjectType ProjectType { get; set; }
    public IList<Page> Pages { get; set; }
}

public class Page : Entity
{
    public string Name { get; set; }
    public Project Project { get; set; }
    public IDictionary<User, RoleBehaviour> RolesForPage { get; set; }
}

public class ProjectType : Entity
{
    public IQueryProcessor QueryProcessor { get; set; }

    public IList<RoleBehaviour> RoleBehaviours { get; set; }

    public RoleBehaviour GetRoleFor(USerType userType)
    {
        var behaviour = return QueryProcessor.Execute(new GetRolesByUserAndProjectTypeQuery() {
        ProjectType = this,
        UserType = userType
    });

    // Filter behaviour attributes for project type properties, business rules, etc...
    // FilterBehaviour(behaviour);
    return behaviour;
  }
}

public class GetRolesByUserAndProjectTypeQuery
{
    public UserType UserType { get; set; }
    public ProjectType ProjectType { get; set; }
}


public class GetRolesByUserAndProjectTypeQueryHandler
{
    public Db Db { get; set; }
    public RoleBehaviour Execute(GetRolesByUserAndProjectTypeQuery query)
    {
        return Db.FirstOrDefault(r => r.UserType == query.UserType && r.ProjectType == query.projectType);
    }
}

public class RoleBehaviour : Entity
{
    public Role ROleForArea1 { get; set; }
    public Role ROleForArea2 { get; set; }
    public UserType UserType { get; set; }
    public ProjectType ProjectType { get; set; }
    public IDictionary<string, string> Attributes { get; set; }
}

public enum UserType
{
    A,
    B,
    C,
    D
}

public class Role : Entity
{
    public IList<string> Permissions { get; set; }
}

我不使用存储库,不需要数据抽象,我使用CQRS进行crud操作。 (CreateProjectCommand,GetRolesByUserAndProjectTypeQuery等。) 用户涉及很多项目和页面。用户拥有多个每个页面实体的角色,并在用户(客户端)请求获取所有项目页面或单页项目时动态创建。

我的页面角色服务确定活动用户及其管理员的页面角色。我的MVC控制器使用PageRoleService。

  1. PageRoleService是应用服务或域服务还是.....?
  2. 实体中的QueryProcessor(ProjectType)是无效的方法吗?如何在没有懒惰或急切加载的情况下处理这个/他们的问题?
  3. RoleBehaviour是实体还是价值对象?
  4. PageRoleService是域中的服务或业务逻辑吗?

1 个答案:

答案 0 :(得分:0)

我知道我几年后,但是:

我会放弃基类Entity,因为它看起来这只是queryhandler返回的Dtos(infact GetRolesByUserAndProjectTypeQueryHandler.Execute返回RoleBehaviour)。

鉴于此,我认为:

  1. PageRoleService是一个完成Dto的简单服务,因此它看起来像一种工厂
  2. 鉴于ProjectType在这里有两个不同的角色(Dto和Entity,这是针对CQRS的),如果:
    1. 它是Dto,然后使用服务/工厂/ ORM在其上加载额外数据
    2. 它是一个实体,尝试加载它所需的所有数据。这是因为您在执行命令的过程中需要进行大量更改(great explanation about DDD and entities)。
  3. 对象有自己的身份吗?即使事情会发生变化,它仍然是一样的吗?看着它,它看起来只是一个Dto,没有什么真正有趣的(在业务层面)。
  4. 见1.