2013-09-23 73 views
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等)。 用户关联了很多项目和页面。用户对每个页面实体的角色不止一个,并且在用户(客户端)请求获取所有项目页面或单个页面项目时动态创建。DDD/CQRS,实体有权访问Query,Command?

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

  1. PageRoleService是应用程序服务或域服务或.....?
  2. QueryProcessor in Entity(ProjectType)is invalid approach?如何处理这个/他们的问题没有懒惰或急切加载?
  3. RoleBehaviour是实体还是值对象?
  4. PageRoleService是域中的服务还是业务逻辑?
+1

“我使用CQRS进行粗碎作业。”为什么? –

+0

@DennisTraub我不使用存储库模式,我更喜欢使用应用程序服务中的数据访问。另外我的应用程序具有基于命令的UI。所有操作都是命令。 – oguzh4n

+1

您不需要任何CRUD存储库。而且你也不需要CQRS。如果解决方案比您想要解决的问题更复杂,那么可能会稍微偏离一些问题。 –

回答

0

我知道我是几年后,但:

我会收起了基类实体,因为它看起来,这只是DTOS由queryhandler(INFACT GetRolesByUserAndProjectTypeQueryHandler.Execute返回RoleBehaviour)返回。

鉴于此,我认为:

  1. PageRoleService是一个简单的服务,完成DTO的,所以它看起来是一种工厂
  2. 鉴于项目类型在这里有两个不同的角色(一个DTO和实体,这是对CQRS),如果:
    1. 这是一个DTO,然后用服务/工厂/ ORM加载就可以了额外的数据
    2. 它是一个实体,尝试加载所有这一切通过它所需的数据。这是因为在执行命令的过程中需要执行很大的更改(great explanation about DDD and entities)。
  3. 对象有它自己的标识吗?它有一个Id,即使事情会改变,仍然是一样的吗?看着它,它看起来只是一个Dto,没有什么真正有趣的(在商业层面)。
  4. 请参阅1.