我坚持设计我的项目的身份和访问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等其他技术。
答案 0 :(得分:0)
为Role
或People
设置子类可能不是一个好主意(我不清楚你是否同时参考两者)。
对于Role
,它不是因为"类型"角色(Planner等)只是Role
的属性,而不是子类型。角色子类型类似于PersonRole
或CompanyRole
。
对于People
,它似乎不是一个好主意,因为
角色可以改变。子类型(实际上)是不可变的,就像Bike
总是Vehicle
类型"自行车"永远不要变成Car
。
它会阻止通过架构为人分配两个角色的可能性。建筑约束是最难改变的。也许目前,一个人是否可以担任多个角色并不是一个问题,但未来可能会这样。
当谈到基于人的角色的行为差异时,你应该考虑其他行为模式而不是继承。另请查看composition over inheritance。