2013-02-11 91 views
0

我們可以將一個工廠上聚合根,密切參與產卵另一個對象的對象上,或者我們可以實現它作爲一個服務(通常創建整個集合)。創建一個聚合的工廠應該放在哪裏?

一)在大多數情況下,應該在哪裏創建一個聚合根工廠放置(假設是有道理的創建只是而不是整個集合)?上根本本身?

b)同樣,在這裏應該在大多數情況下,一個工廠創建完整的總結放在哪裏?

謝謝

+1

我不知道這是否有幫助,但在Java中,我將它們放在與它試圖創建的類相同的包(.net名稱空間)中,因爲工廠和服務(在我看來)是領域模型。也許有些人更喜歡把工廠放在不同的包裝中,但我認爲這可能是一個風格問題。我總是把這些工廠放在不同的類中,因爲他們的責任與他們正在創建的對象(構建對象與純領域邏輯)的責任非常不同。 – Augusto 2013-02-11 19:48:29

+0

是的,我知道工廠屬於域層 – user437291 2013-02-11 22:06:55

+1

我不認爲有一套適用於所有情況的規則。它確實取決於您的域名和您想要實現的表達類型。您可以在聚合本身上創建構造函數方法,讓外部類爲您構建聚合,或者尋找服務來完成這項工作。在某些情況下,您可能想要防範不變量,而在其他情況下則不需要。重要的是,該域名錶達了業務意圖。 – stephenl 2013-02-11 22:54:26

回答

0

一)在大多數情況下,應該在哪裏創建一個聚合根工廠放在(假設是有道理的創造不僅僅是根,而不是整個集合)?在根本身上?

只有創建聚合根對象本身時,才提供工廠方法。在我看來,大多數情況下,這僅僅是一種用於分配內存和調用初始化例程(Objective-C中的[Foo fooWithBar:...]而不是[[Foo alloc] initWithBar:...])或使用帶參數的構造函數(例如,Ruby中的new Foo(...))的靜態便利方法。

b)同樣,在大多數情況下應該在哪裏設置一個用於創建完整Aggregate的工廠?

正在測試一個問題?

我發現驗證靜態(工廠)方法的行爲是一個痛苦的考驗。從本質上講,你必須像遺留代碼和重構一樣對待你的代碼,直到它是可測試的。但是,如果測試規定了代碼,則不會遇到這樣的問題。而不是使用工廠方法模式,而是使用抽象工廠來代替並依賴於其實例方法。所以,如果你把工廠放在一個指定的工廠對象內:爲了創建複雜的聚集對象,我傾向於使用多個工廠對象。有一個聚合根工廠其他人都會談。它利用工廠來製造骨料。通過這種方式,您不會將複雜的對象創建工作鏟入單個工廠,隨着您的代碼庫的發展,這種工廠常常會發生變化。相反,聚合根工廠取決於其他工廠做部件的初始化。

工廠應該放在領域層,作爲你的問題的評論者已經指出。

編輯:尤其是當您從存儲庫重新構建聚合時,將使用多個工廠會很有用。例如,如果您放入深度嵌套的JSON,則只能測試工廠返回的對象。但是,如果您將創建子對象委託給其他工廠,那麼您將能夠(1)在測試中模擬它們,並且(2)驗證(1)我的合作者與(ii)數據已經分解了。