用户和角色多对多问题,对象间关联处理问题

11-12-29 hushawn
         

最近刚开始在学习DDD,想在项目中实践下,现在在弄权限管理部分,在建立用户和角色模型时候,经过分析后得出

(1)用户对象和角色对象是对多对关系,模型中加了个关联类叫角色分配类(就是给用户分配一个或多个角色)

(2)因为没有具体业务需求,我决定在界面上在添加用户时候为该用户分配一个多个角色,把用户和分配关系当成一个聚合进行持久化,替换更新,得出下面类

用户(用户账号,密码,角色分配列表,获取所有角色方法)

角色分配(用户,角色)

角色(角色名称)

这样行吗?

(3)因为一般只会关心用户有哪些角色,而不会关心一个角色有哪些用户使用,所以角色里没有用户列表和角色分配类列表;

用户和角色分配组成一个聚合,用户是聚合根,角色分配是聚合里的值对象,这样做可以吗

(4)我在做登录验证时候,通过界面调用应用服务层的方法

Login(string userAccount, string password)

{

调用UserRepository里的FindUserByUserAccountPassword(userAccount, password)

获取User领域对象,根据是否为空判断是否通过验证

}

这个用户登录功能的实现方式对吗?

因为聚合是一个整体,一起持久化,一起更新,是否一起查询出来,如果是一起查询出来,FindUserByUserAccountPassword我就准备建个视图,把用户,角色,用户角色关联表一起关联起来,查询出来,构建出用户对象,用户关联对象,角色对象,而我现在只是验证账号和密码是否有 ,按照以前做法只需要验证用户表,所以在这里FindUserByUserAccountPassword是否只构建用户对象,而不构建聚合里的值对象就是角色关联对象,一个是查询性能好,这是否违背DDD的聚合原理?

(5)另外我如果要在用户和一个员工关联,也就是把这个用户指定给了一个员工,员工有员工姓名和员工编号,我认为员工是单独的实体,假设员工和用户是一对一关联关系,那么用户就变成

用户(用户账号,密码,角色分配列表,获取所有角色方法,员工)

员工(员工姓名,员工编号)

这样在用户里引用了员工对象应该是对的吧,现在的问题是用户和员工之间应该是没有聚合关系,当我查询一个用户领域对象的时候,根据聚合概念不应该把员工对象构建出来,但是我有需求当登录后,要在界面上显示用户对应的员工的姓名和员工工号,那我怎么去获取这个信息呢?难道分两次去读取操作,另外领域对象查询出来后的操作是在内存里操作的,而其领域内不应该涉及技术性的东西,不能在领域对象内有使用Repository的功能,看了些资料说在service(不知道是应用服务,还是领域服务)再去调用员工的Repository去读取相关信息,这样的话是不是太麻烦,还要两次读取数据库,标准做法是什么样的?

总结下,就是DDD怎么处理处理各种聚合根间的关联或者说是对象间的非聚合引用关系

请各位老师指教下,比较具体的问题,真是有点迷惑,非常感谢

         

25
banq
2011-12-30 09:47

2011年12月29日 23:20 "@hushawn"的内容
用户和角色模型 ...

用户和角色模型不是一种天然结构上关联关系,任何用户都可以在系统运行过程中被管理员动态分配给任何角色模型,这是一种类似服务的功能模型,不是静态类模型。

建议结合DCI来分析。

hushawn
2011-12-30 10:45

刚学DDD,DCI还不熟悉,老师能看下我其他的描述对不对

banq
2011-12-30 11:11

2011年12月30日 10:45 "@hushawn"的内容
刚学DDD, ...

我个人意见:前面没有说清楚,非天然静态结构关系,不适合用DDD来分析。所以,DDD什么聚合原理对你的分析都不构成约束,不在DDD边界内。

你就把用户和角色分配当做一般业务活动来分析即可。

hushawn
2011-12-30 14:30

主要个问题是关联对象的数据怎么加载,一次全部加载还是按需加载

是不是,我界面需要单个用户的及其对应员工信息时,我就从数据库读取数据,把用户(此时就加载员工关联对象?不加载用户分配列表?)构建出来到内存?再通过用户.员工.员工编号 访问,如果用户.角色分配列表 就访问不到数据

而当我需要修改用户信息时候,因为界面上需要用户及其角色分配信息,所以这时候读取数据库,把用户及其相关的角色分配对象构建出来,员工引用对象就不创建,此时如果这样访问用户.员工.员工编号就不能访问

这是不是不符合DDD的repository的思想,又变成了DAO?

但是

如果一次性全部加载关联对象,外一有很多关联对象,那性能肯定有问题

[该贴被hushawn于2011-12-30 14:37修改过]

6Go 1 2 3 4 ... 6 下一页