2013-07-12 50 views
2

我的域對象在需要時可以使用工廠方法或工廠圖層嗎?我的域對象在需要時可以使用工廠方法或工廠圖層嗎?

我一直試圖讓客戶端代碼創建並注入依賴關係,無論它們存在於何處,但似乎並不總是正確的做法。在這裏的這個問題,例如Where to check for mandatory properties in a domain object?,用戶可以擁有許多寵物;沒有用戶,寵物就不能存在。

我一直在試圖創建一個寵物,然後將其添加到用戶的集合,但問題是,爲了創建寵物,我需要提供用戶(這打敗了具有User::addPet(ConcretePet)方法的目的)。

我寧願做的是有一個User::addPet()方法接受參數數組,然後使用工廠或工廠方法創建寵物。這是否合理?

編輯:另一種情況

這裏還有一個場景,我想我的域模型來訪問一家工廠。如果我的用戶需要他們擁有的每個Pet的許可證對象,那麼在User :: addPet(ConcretePet)方法中創建它是否合理?當然,我可以在服務層創建許可證,但這又意味着將業務邏輯從域中拿走!

回答

0

如果一個寵物不能存在沒有它的用​​戶,它並不意味着一個用戶可以沒有寵物存在。

問題是寵物是否需要它是用戶,反之亦然。我幾乎可以考慮單獨存在,並且交叉引用它們可能是一個好主意或不是,這取決於問題。一般來說,我會說它不太好,因爲這意味着用戶可以與寵物進行交互,並且寵物可以與用戶進行交互,並且這兩種交互都可以觸發反向交互,從而導致無限循環。

更安全的解決方案應該是包含用戶和寵物並指示它們之間的所有交互的對象:用戶 - 寵物關係。

如果您聲明無法注入對象依賴關係,那麼您做錯了事情。如果您想要注入一個工廠,您將使用服務定位器反模式,這是應該避免的另一種代碼異味。

我寧願做是有一個用戶:: addPet()方法,該方法接受一個 陣列的參數,然後使用一個工廠或工廠 方法創建的寵物。這是否合理?

不是。這個函數裏面沒有任何其他信息。所有的寵物參數都存在,並且你有用戶對象。您還需要創建一個與用戶有關係的寵物,然後將該寵物添加給用戶?

+0

嗨史文,我可以創建一個沒有寵物的用戶,沒問題。當我創建寵物時,我可以注入用戶,沒問題。事實上,我有一個可以做到這一點的服務層,沒有問題。但是這使我的領域模型真的很乏味。我可以在User對象上放置addPet(ConcretePet)方法,但它會做什麼?寵物已經附着在用戶身上,沒有什麼可以做的了。 –

+0

如果沒有什麼可以做的,那麼你希望更多?除非有理由,否則你不應該做太多必要的事情。但我仍可能誤解你的問題。 – Sven

+0

嗨,Sven,如果我讓服務層在向用戶添加寵物之後看起來服務層,我的域模型開始變得貧乏。如果領域模型應該反映現實世界,我想我需要一個用戶的addPet方法。 (否則我的域邏輯分佈在兩層)。 –