基于上下文或调用者的域实体方法的有效性

时间:2019-05-29 06:01:08

标签: dependency-injection entity domain-driven-design aggregateroot invariants

我目前正在阅读有关DDD的信息,并且对如何实施特定验证存在疑问。

场景:

我有一个实体Group,其中包含Member的列表,而列表又由UserMemberStateMember,{{ 1}})。实体具有方法Admin,可以将成员转变为管理员。

规则是:仅当当前用户是该组的管理员时,才允许将该成员转为管理员。

我想到了三种可能的实现方式,每个实现方式都有一些警告。

变体1

MakeAdmin(User user)实体通过构造函数注入依赖项Group以获取当前用户。这样,该实体可以检查当前用户是否为admin并被允许切换成员状态。 警告:我不喜欢域实体注入了这样的依赖关系,并且我认为在DDD视图中这是不正确的。

变体2

方法IUserContext获得一个附加参数,该参数将其转换为MakeAdmin()。这消除了实体中对MakeAdmin(User user, User currentUser)依赖性的要求。 警告:我不确定该实体验证此规则是否完全正确,因为它实际上并不是该实体的不变式。

变体3

在应用程序服务中验证此规则,并且仅在通过验证后才调用IUserContext。 警告:我认为规则域是特定的,因此我认为将其放在应用程序层中是不正确的。

那么什么是最好的选择,还是有一些完全不同的变体?

1 个答案:

答案 0 :(得分:0)

我的建议是选择第三个选项:在应用程序/集成层中授权访问,然后调用域。

这实际上适用于任何域功能。领域不应该关注是否可以基于授权执行操作,而应该仅关注领域。如果在特定的Identity & Access Control受限制的上下文中,该授权操作恰好是域关注的问题,那么这是有道理的,但您不会经常遇到这些问题。