DDD:有界上下文中每用户ROLE的具体类型。身份和访问

时间:2015-03-02 07:20:01

标签: entity-framework symfony orm doctrine-orm domain-driven-design

我坚持设计我的项目的身份和访问DDD。 我在系统中有像Marketer,Coordinator,Planner这样的角色。 我所做的是为每个角色创建具体类型,并将其信息保存在表名people(名称,电子邮件)上。对于凭证,我有users表(用户名,密码)和表roles。基本上人和用户表具有相同的ID。 (当我创建用户时,我也会创建人(人)并分配id = user_account_id。

我的问题是,检查用户的角色以确定我应该实例化哪种具体类型似乎是不自然的。我的people中的每种类型都有鉴别器列。我甚至不知道每个角色创建具体类型是否是一个好主意。

当我有具体的类型时我觉得它更好,所以我可以做类似

的事情
$inquiry = $marketer->makeInquiry($client, $subject);

而不是

$inquiry = new Inquiry($client, $subject, $marketer);

我也想出了使用id而不是具体的类型实例的想法,但是当我需要显示关于这个人的信息(people)时出现问题,因为我只是有id。

那么,解决这个问题的最佳方法是什么?

我正在使用Symfony2和Doctrine(如果它很重要),但我认为它甚至适用于ASP MVC和EF等其他技术。

1 个答案:

答案 0 :(得分:0)

RolePeople设置子类可能不是一个好主意(我不清楚你是否同时参考两者)。

对于Role,它不是因为"类型"角色(Planner等)只是Role的属性,而不是子类型。角色子类型类似于PersonRoleCompanyRole

对于People,它似乎不是一个好主意,因为

  1. 角色可以改变。子类型(实际上)是不可变的,就像Bike总是Vehicle类型"自行车"永远不要变成Car

  2. 它会阻止通过架构为人分配两个角色的可能性。建筑约束是最难改变的。也许目前,一个人是否可以担任多个角色并不是一个问题,但未来可能会这样。

  3. 当谈到基于人的角色的行为差异时,你应该考虑其他行为模式而不是继承。另请查看composition over inheritance