DDD 和 C# - 限制对子实体的访问

问题描述 投票:0回答:4

我几乎可以肯定我忽略了一些简单的事情,但它还没有成功。

我有一个 Person 实体(Person 聚合的根)。我还有一个用于身份验证和授权 (Auth) 的子实体,其中包含角色列表和权限列表。

我希望通过根目录管理对角色和权限的修改,使用根目录上的 AddAuthRole 等方法。

这相当简单,但是我该如何在不暴露 Auth 实体中任何类似功能的情况下执行此操作呢?我不希望消费者使用对子项的引用来尝试针对这些列表添加和删除。

我有一种感觉,这是一些基本的面向对象概念,我应该为不了解而感到羞耻......

c# oop domain-driven-design aggregateroot
4个回答
3
投票

在 IMO 看来,限制对聚合成员的访问更多的是一个约定问题,而不是严格执行。我不相信你可以在聚合周围设置“物理”边界,它们限制太多,而且不必要地复杂。请参阅 .NET 中的 DDD / 聚合

我不太了解示例中类的设计,但是如果身份验证和授权是人员聚合的成员并且您想要保护它们,则不要从外部引用它们。这只是一个基本的 DDD 约定,团队中的每个程序员都应该关心 - 除了直接指向聚合根的引用之外,没有跨聚合引用。

如果您使用不可变的值对象,对域对象的访问限制和保护的需求也将大大减少。角色和权限通常可以是这样的值对象,允许您将它们公开给世界,而不会有外部对象摆弄它们的状态并修改它们的风险。因为这就是聚合的首要用途:将某些实体的所有操作规则收集在一个地方,以防止任何人摆弄这些实体。


1
投票

如果您通过更具限制性的接口(也许是 IEnumerable)公开列表,您将能够控制聚合的用户如何访问它们。通过 IEnumerable 公开的列表,与根上的添加/删除方法相结合,应该可以为您提供我所解释的您想要的内容。


0
投票

Protected 用于子类。内部会更合适,尽管它不会阻止同一程序集中的其他实体


-1
投票

暴露的方法应该受到保护,所有其他方法都应该是私有的

© www.soinside.com 2019 - 2024. All rights reserved.