0

我在开发新系统时尝试使用 DDD。在这个系统中,我有地点,我需要根据您所属的广告组授予对地点的访问权限。我还需要从广告组列表中获取允许的地点列表。

我想出了以下几点:

interface IPlaceRepository
{
  Places[] GetPlacesForGroups(AdGroup[] adGroups);
}

class AdGroup()
{
  string Name { get; private set; }
}

class Place
{
  string Name { get; private set; }
}

现在我需要添加一个函数来授予组访问特定位置的权限。根据 DDD,这是正确的方法吗?我有两个建议。我假设广告组可以被视为价值对象。

  1. 向 Place 添加一个功能。

void GiveAccessTo(AdGroup adGroup) { ... }

并向 IPlaceRepository 添加一个函数。

  void AddGroupToPlace(Place p, Group g) { ... }

然后我需要将 IPlaceRepository 注入 Place 以在 GiveAccessTo 中使用。

  1. 另一种方法可能是创建一个 ISecurityService?我可以在该服务上想到这样的方法。

void GiveAccessToPlace(AdGroup g, Place p)

与选项 1 一样,我需要在 IPlaceRepository 上实现一个方法并将存储库注入到服务中。

执行此操作的 DDD 方法是哪种?

4

2 回答 2

4

存储库保存完整的聚合,通常你不会有一个AddGroupToPlace方法。

由于ADGroup是一个值对象,您可以使用该GiveAccessTo方法将组添加到Place聚合中。之后,您使用存储库来保存完整的Place聚合。

当一个操作跨越多个聚合时,主要使用服务。不过,这通常可以通过使用事件来避免。

于 2013-09-27T07:46:05.810 回答
0

(间接回答)

不确定 DDD 是否有一些专门针对您的案例的规则。我会按照以下步骤操作:

  • 在纸垫上画出聚合,注意根聚合(哪个实体包含另一个)
  • 绘制您的查询
  • 列出几种存储允许项目列表的方法
  • 请记住如何将其存储在面向文档的数据库中或其他位置(这是物化视图可能使事情复杂化的地方)
  • 几种方法可能是有效的,返回您的查询并选择最佳方法(内存消耗、速度、需要查询的最少项目数)
  • 将安全性与业务 API 分离,从您使用的框架中使用授权模式
  • 仅使用白名单(列出所有允许的资源,默认全部拒绝)
于 2013-09-26T12:28:23.787 回答