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