【问题标题】:DDD: is it ok to inject a Repository into an Entity? [duplicate]DDD:可以将存储库注入实体吗? [复制]
【发布时间】:2012-01-27 02:57:48
【问题描述】:

可能重复:
Why not use an IoC container to resolve dependencies for entities/business objects?

我过去问过very similar question。但是,我相信这不是自我重复:我最初问题的(好的)答案是针对这个领域问题非常具体的,而不是一般性地讨论这个问题。

让我们举一个我遇到的新例子:

  • 我有一个Zone 实体,有一个关联的边界;
  • 我有一个Store 实体,它有一个location 和一个zone 属性;
  • ZoneRepository 可以找到包含特定位置的 Zone。

Store 的zone 属性永远不应直接设置,而应在分配此属性时从location 中扣除。因此,我觉得这样做是合乎逻辑的:

class Store
{
    public void setLocation(Point location, ZoneRepository repo)
    {
        this.location = location;
        this.zone = repo.findByLocation(location);
    }
}

这种方法有缺点和注意事项吗?如果是这样,您能否提出现实的替代方案?

【问题讨论】:

  • 这不是重复的问题。这个问题是关于 DDD 的观点,假设的重复问题与 DDD 无关
  • @fabien7474 欢迎来到 StackOverflow,投票孕育另一个。如果您认为值得,您可以投票重新提出这个问题!

标签: dependency-injection domain-driven-design repository repository-pattern ddd-repositories


【解决方案1】:

Zone 和 Location 有什么关系? Zone 必须有 Location 属性,对吗?否则您将无法按位置搜索区域。这可能是双向关系吗?我的意思是,你为什么不能这样做?

class Store
{
    public function setLocation(Point $location)
    {
        $this->location = $location;
        $this->zone = $location->zone;
    }
}

或者,您可以冷使用上层中的存储库,然后只需传入您需要的内容:

class Store
{
    public function setLocation(Point $location, Zone $zone)
    {
        $this->location = $location;
        $this->zone = $zone;
    }
}

通常,除非绝对必要,否则我不会注入存储库,而在这种情况下则不是。即使这样,我也不会将它传递给方法,我会使用 IOC 容器将它传递给它。

【讨论】:

  • 问题中可能不清楚,但位置是Point,区域的边界是Polygon。当商店的位置在地图上被精确定位时,我需要找到包含该点的区域。
  • 在这种情况下,我会提出我的第二个建议。
  • 这确实是一个解决方案,但它不能保证调用此方法时会使用一致的location zone 数据!
猜你喜欢
  • 1970-01-01
  • 2017-05-18
  • 2013-12-05
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
相关资源
最近更新 更多