0
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 是 Application Service 还是 Domain Service 还是.....?
  2. Entity (ProjectType) 中的 QueryProcessor 方法无效?如何在没有延迟或急切加载的情况下处理这个/他们的问题?
  3. RoleBehaviour 是实体还是值对象?
  4. PageRoleService 是域中的服务还是业务逻辑?
4

1 回答 1

0

我知道我在几年后,但是:

我会收起基类 Entity,因为它看起来只是查询处理程序返回的 Dtos(实际上GetRolesByUserAndProjectTypeQueryHandler.Execute返回 a RoleBehaviour)。

鉴于此,我认为:

  1. PageRoleService 是一个完成 Dto 的简单服务,因此它看起来像是一种工厂
  2. 鉴于此处的 ProjectType 有两个不同的角色(Dto 和实体,这是针对 CQRS),如果:
    1. 它是一个 Dto,然后使用服务/工厂/ORM 在其上加载额外数据
    2. 它是一个实体,尝试加载它需要的所有数据。这是因为在执行命令的过程中需要进行很大的更改(关于 DDD 和实体的很好的解释)。
  3. 对象有自己的身份吗?是否有一个身份,即使事情会发生变化,仍然保持不变?看着它,它看起来只是一个 Dto,没有什么真正有趣的(在业务层面)。
  4. 见 1。
于 2016-10-07T10:44:03.087 回答