2

我正在尝试以 DDD(域驱动设计)的方式做事。男孩,我挣扎。在我读过的所有书中,身份验证都是无关紧要的,也没有提到!

我编写了自己的身份验证和会员服务,负责注册和登录用户、创建加盐密码等。我不使用 .NET 的会员提供程序,但确实依赖表单身份验证。

我已经实现了一个包含用户名、电子邮件、密码哈希、批准状态等的用户模型。

现在我想域模型的其余部分不应该与用户相关。我有一个 Person 类,用于对 Person 及其相关数据进行建模。因此,它可用于对来自用户和非用户的个人数据进行建模。Company 类型的对象与 Persons 一起使用,而不是与 Users 一起使用。一个活动被分配给一个人,而不是一个用户。

问题是,我如何将 Person 模型与 User 模型联系起来?我真的不想在两个模型中的任何一个中相互引用。我是否应该创建一些名为 PersonUser 的关系模型并创建一个额外的服务来检索当前经过身份验证的用户的人员对象?

4

1 回答 1

2

从您介绍的内容来看,您有几个已知的事实:

  1. 每个用户都是一个人
  2. 不是每个人都是用户

在这种情况下,我将扩展 person 模型以包含一个可为空的 UserId 字段,以便您可以将 User 与那些也是用户的 Person 关联起来。

现在我还将假设您在人员模型中有几个“获取”方法..通过 ID、姓名、部门等检索人员......

我将重载(或创建不同的)获取方法以也从用户中检索人员对象(这可以是 id 或 foll 用户对象)。

public IPerson Fetch(IUser user) {}

当然,既然你知道每个用户也是一个人,我个人认为将用户对象扩展为包含一个人属性并没有什么坏处或犯规......

public interface IUser 
{
   ...
   IPerson Person { get; set; }
}

然后,您可以像往常一样返回用户对象......也许对用户中的人员字段进行一些时髦的延迟加载......或者在您获取用户对象时填充两者。

我不确定创建 User <-> Person 的“映射”表是否会给您带来超出我上面概述的任何东西(尽管您会从核心 DBA 那里获得非规范化数据的荣誉)..对我来说,这只是一个额外的表格,可以加入以获得相同的效果。

于 2009-05-07T12:46:36.210 回答