我在寫一個合理的'純粹'的DDD應用程序。我沒有使用CQRS。持久性是使用EF6的基礎架構服務。如何在使用實體框架和DDD時實例化新對象?
現在,假設我有一些方法需要創建一個新的A型實體並將其添加到其他實體(B)的導航屬性集合中。該方法將位於域程序集中的某處,或者可能位於應用程序服務程序集中。
如果我正在編寫一個小應用程序,我只需調用DBSet.Create方法,以確保我得到了代理對象的引用(使用延遲加載),然後我可以將它添加到B的導航屬性中。
但是,考慮到我的應用程序和域程序集並沒有意識到我正在使用EF來實現持久性,我如何確保不會中斷延遲加載?如果我只是調用A的構造函數,那麼我沒有代理對象。我應該在應用服務中處理這個事實(感覺全部錯誤),或者讓構造函數受到保護,然後將工廠傳遞給有問題的域/應用服務?
編輯:我這樣做都錯了嗎?也許我可以降低/消除我的問題如下:
- 我已經習慣了能夠添加到導航集合EF,保存,然後填充有我收集的另一端。但是,在創建DDD時,我想我應該填充新實體的任何關係的兩端?這將消除我的導航問題。
- 我還需要一個代理對象嗎?在大多數情況下,我不會猜測。在持續存在新實體的事務發生之前,無需從數據庫中獲取任何內容。
- 如果我試圖保持DBContext的生命期不僅僅是創建(插入)事務,那麼我需要讓我的持久層將新實體添加到DBContext(這意味着跟蹤哪些已創建),或者傳入DBContext的DBSet.Create方法作爲工廠使用的構造函數。
爲什麼你需要一個新實體的代理對象?它即將被插入。在我看來,它可以在應用程序服務或域中,這取決於。例如,如果新對象是聚合的一部分,那麼聚合負責創建。 – jannagy02
嗨,謝謝。您需要一個代理對象來避免集合上的空引用異常。它爲什麼幾乎沒有關係,它更多的是關於如何防止這些持久性問題泄漏到域。我認爲答案必須是一個傳入的工廠,這被應用服務所使用。 – Chalky
當你想創建一個新的A型實體並將其添加到其他實體(B)的導航屬性集合中時,只需執行它。該域仍然是持久性無知的,你不需要延遲加載,因爲它不在數據庫中,當你調用SaveChanges時,EF會插入它。 – jannagy02