DDD。实体或服务的方法?

时间:2013-09-26 12:10:55

标签: c# domain-driven-design

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

我想出了以下内容:

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

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

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

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

  1. 向Place添加功能。
  2. void GiveAccessTo(AdGroup adGroup) { ... }

    并向IPlaceRepository添加一个函数。

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

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

    1. 另一种方法可能是创建一个ISecurityService?我可以在这项服务上想到这样的方法。
    2. void GiveAccessToPlace(AdGroup g, Place p)

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

      这是DDD的方法吗?

2 个答案:

答案 0 :(得分:4)

存储库会保留完整的聚合,通常您没有AddGroupToPlace方法。

由于ADGroup是值对象,因此您可以使用GiveAccessTo方法将组添加到Place聚合。完成此操作后,您将使用存储库来保留完整的Place聚合。

当操作跨越多个聚合时,主要使用服务。尽管如此,通常可以避免这种情况。

答案 1 :(得分:0)

(间接答案)

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

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