我目前正在阅读有关DDD的信息,并且对如何实施特定验证存在疑问。
场景:
我有一个实体Group
,其中包含Member
的列表,而列表又由User
和MemberState
(Member
,{{ 1}})。实体具有方法Admin
,可以将成员转变为管理员。
规则是:仅当当前用户是该组的管理员时,才允许将该成员转为管理员。
我想到了三种可能的实现方式,每个实现方式都有一些警告。
变体1
MakeAdmin(User user)
实体通过构造函数注入依赖项Group
以获取当前用户。这样,该实体可以检查当前用户是否为admin并被允许切换成员状态。
警告:我不喜欢域实体注入了这样的依赖关系,并且我认为在DDD视图中这是不正确的。
变体2
方法IUserContext
获得一个附加参数,该参数将其转换为MakeAdmin()
。这消除了实体中对MakeAdmin(User user, User currentUser)
依赖性的要求。
警告:我不确定该实体验证此规则是否完全正确,因为它实际上并不是该实体的不变式。
变体3
在应用程序服务中验证此规则,并且仅在通过验证后才调用IUserContext
。
警告:我认为规则域是特定的,因此我认为将其放在应用程序层中是不正确的。
那么什么是最好的选择,还是有一些完全不同的变体?
答案 0 :(得分:0)
我的建议是选择第三个选项:在应用程序/集成层中授权访问,然后调用域。
这实际上适用于任何域功能。领域不应该关注是否可以基于授权执行操作,而应该仅关注领域。如果在特定的Identity & Access Control
受限制的上下文中,该授权操作恰好是域关注的问题,那么这是有道理的,但您不会经常遇到这些问题。