Dot-Net
沒有行為的實體框架 POCO - 需要重新設計以消除程式碼異味
我使用 Entity Framework Model-First
Repository和Unit of Work模式,儲存庫返回 EF POCO。我假設我無法向 Entity Framework 生成的 POCO 添加行為,因此我的程式碼現在充滿了諸如
XyzServicewhich 是實現 Entity Framework 生成的業務邏輯的單獨類之類的東西Xyz POCO。我有以下問題:
- 這有一種不好的程式碼味道,因為我不僅有 EF POCO,而且我為每個 POCO 提供服務。除了許多類之外,業務邏輯還被拆分到業務實體之外。這是貧血反模式的一個例子嗎?
- 如果我堅持使用 EF,有什麼方法可以添加行為(即通過部分類)或其他方式?
- 看到使用從數據層(在我們的例子中是儲存庫)返回業務實體的持久無知模式,如果我想從
EF-MODEL -> REPOSITORY-DAL -> BIZ-ENTITY我看到在業務實體和 EF 模型 POCO 之間會有很多雙向映射。Automapper 等實用程序能否優雅地處理我可能面臨的嵌套對象的複雜關係?- 為了減少與其對應的 EF 模型實體重複的業務實體,我是否最好刪除 EF 並使用 LINQ to SQL 為每個儲存庫編寫我自己的儲存庫實現?
- 任何可以讓我專注於程式碼的推薦方式(而不是像我一樣首先將目標固定在 EF 模型上),然後在我準備好編寫持久層時仍然使用實體框架,但避免了很多這樣做的額外工作和映射?EF Code-First 在這方面會更好嗎?
如果我錯過了其他可以幫助開發的其他技術(例如 NHibernate),請隨時提及。
- 是的,根據Fowler的說法,這是一種反模式。我個人並不覺得這種反模式太冒犯,但有些人會。在這裡使用最佳判斷。如果感覺不對並且處理起來很痛苦,那就改變它。
- 是的。部分課程可以幫助解決這個問題。您可以將行為放在您編寫的部分中。
- 是的,如果嵌套對像有映射設置,Automapper 將自動處理它們
- 再次,這取決於你。如果 EF 讓您發瘋,請不要使用它。使用有效的方法和讓您在使用時感覺良好的方法。
- Code first正是為此而建構的。