1

可能重复:
Why not use an IoC container to resolve dependencies for entities/business objects?DDD:可以将Repository注入实体吗?

我过去问very similar question。但是,我认为这不是一个自我复制的问题:我原来的问题的(良好)答案对于这个领域问题非常具体,并且一般不会讨论这个问题。

让我们来到我翻过一个新的例子:

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

Storezone属性不能直接设置,但是从location而不是扣除当此属性分配。因此,这听起来合乎逻辑的我做这件事:

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

是否有弊端,警告这种方法?如果是这样,你能建议现实的选择吗?

+0

这不是一个重复的问题。这个问题是关于国内生产总值的角度和假设重复的问题与DDD – fabien7474 2013-05-28 11:38:44

+0

@ fabien7474无关欢迎来到StackOverflow,其中投票品种。如果您认为这是值得的,您可以投票重新开启此问题! – Benjamin 2013-05-28 12:29:48

回答

-1

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

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容器来传递它。

+0

问题可能不清楚,但位置是'Point',区域边界是'Polygon'。当商店的位置在地图上精确定位时,我需要找到哪个区域包含该点。 – Benjamin 2011-12-23 23:20:43

+0

在这种情况下,我会提出我的第二个建议。 – 2011-12-23 23:21:54

+0

这确实是一个解决方案,但它并不能保证这个方法将被调用一致的'location'数据区域'<->! – Benjamin 2011-12-23 23:26:48