由於我正在重新構建遺留企業應用程序的某些核心組件,因此我第一次使用DDD(在.Net中)開始工作。DDD並實現持久性
我想澄清的是,我們如何在適當的DDD架構中實現持久性?
我意識到域本身是持久性的無知,應該使用「無處不在的語言」來設計,並且當然不會被迫進入本月的DAC甚至物理數據庫的約束。
我正確地說,存儲庫接口存在於域程序集中,但存儲庫實現存在於持久層中嗎?持久層包含對域層的引用,反之亦然?
從哪裏調用我的實際存儲庫方法(CRUD)?
由於我正在重新構建遺留企業應用程序的某些核心組件,因此我第一次使用DDD(在.Net中)開始工作。DDD並實現持久性
我想澄清的是,我們如何在適當的DDD架構中實現持久性?
我意識到域本身是持久性的無知,應該使用「無處不在的語言」來設計,並且當然不會被迫進入本月的DAC甚至物理數據庫的約束。
我正確地說,存儲庫接口存在於域程序集中,但存儲庫實現存在於持久層中嗎?持久層包含對域層的引用,反之亦然?
從哪裏調用我的實際存儲庫方法(CRUD)?
我是正確的庫接口住域 組件內,但 持久層中存在的庫實現?持久層包含對域層的引用,從不反過來?
是的,這是一個非常好的方法。
從哪裏調用我的實際存儲庫方法(CRUD)?
不用考慮CRUD術語可能是個好主意,因爲它太過於以數據爲中心,並且可能會導致您進入Generic Repository Trap。 Repository有助於管理domain objects的中期和生命末期。 Factories經常負責開始。請記住,從數據庫中恢復對象時,從DDD角度來看它處於中等階段。代碼如下所示:
// beginning
Customer preferredCustomer = CustomerFactory.CreatePreferred();
customersRepository.Add(preferredCustomer);
// middle life
IList<Customer> valuedCustomers = customersRepository.FindPrefered();
// end life
customersRepository.Archive(customer);
您可以直接從您的應用程序調用此代碼。這可能值得下載,並看着埃文的DDD Sample。 Unit of Work模式通常用於處理交易和抽象選擇您的ORM。
查看有關該主題的什麼Steve Bohlenhas to say。演示代碼可以在here找到。
我在演示文稿中發現了關於如何爲存儲庫建模的信息。
非常好,絕對是我見過的最直接的DDD介紹。代碼很好,因爲它不像其他許多示例那樣花哨的管道。不幸的是,對於事情的實際情況,我真的很想找到幫助。 – EkoostikMartin
我是正確的庫接口住域 組件內,但 持久層中存在的庫實現?持久層包含對域層的引用,從不反過來?
我不同意在這裏,讓我們假設一個系統由以下層組成:
假設這裏是你越高,圖層越不穩定(呈現最高,呈現最低,資源/存儲最低)。正因爲如此,您不希望資源訪問層引用業務層,這是相反的方式!業務層引用資源訪問層,您稱DOWN不UP!
您將接口/合同放在它們自己的程序集中,而它們在業務層中完全沒有用處。
我同意德米特里在這裏所說的一切,爲清楚起見,我唯一要補充的是我建議你的客戶/ UI項目引用一個'Application Services'層,它調用域上的方法(域聚合或域服務)並從這裏調用存儲庫。這樣,所有的邏輯都包含在這個應用程序服務中,您可以輕鬆地更改/添加用戶界面。 –
我只會在對應用程序有明顯好處時才添加服務層,而不僅僅是爲了它。服務層是一個額外的抽象層,在許多情況下你可以不用。 –
@RobinvanderKnaap,事實並非如此,在實際軟件開發情況下,應用程序服務層始終是必需的。如果您將UI開發團隊交給域圖層,則可能a)不知道如何使用它,b)可能會濫用它。您需要明確界面可以使用您的業務API(域層)做什麼。 –