2010-05-16 42 views
13

在單獨的數據訪問&業務邏輯層,我可以在業務層使用實體框架類嗎?在單獨的數據訪問和業務邏輯層中,我可以在業務層中使用實體框架類嗎?

編輯:我不認爲我將來需要從我的業務邏輯中交換數據訪問層(即將SQL Server),但是我會爲UI層。因此,這個問題更多的意味着是否在業務層使用EF類有任何主要問題?似乎會有更少的管道代碼。

+0

我真的好奇聽到更多關於這個問題。我很想看看TomTom如何解決這個問題。 – 2010-05-17 20:53:22

回答

15

通常情況下,「最佳實踐」的做法是這樣的:在您的數據層

  • ,你有獲得來自加載並存儲到數據庫中

  • 在EF實體你的業務層,你有你自己的域對象(只是簡單的C#類),代表你的應用程序需要處理的數據。這些可以或多或少與數據層實體相同,或者它們可以包含幾個「原子」實體來組成業務對象,或者它們可以有很大的不同。爲了減少對左右手賦值語句的大量需求(在數據層實體和業務層對象之間來回移動屬性值),您應該查看諸如AutoMapper之類的工具,這些工具可以很容易地設置一個類似的對象類型之間的「映射」,讓你輕鬆地分配這些類型來回

  • 你的UI層(一個或多個),然後將可視化和表示業務層對象給用戶的信息和/或操縱

好處是您的業務層領域模型代表您正在使用的實際業務對象,並且變得或多或少獨立於這些真的存儲在數據層中。而且,這樣可以避免將UI層「粘合」到特定的數據訪問技術。

當然 - 這是一個企業級的應用程序,你可能需要換出數據訪問層等。對於一個簡單的應用程序推薦的最佳實踐,您可能會跳過這些做法,知道你在做什麼這樣做,並且如果您將EF實體貫穿業務層一直使用到UI中,那麼您將自己「鎖定」到EF中。如果這與你和你的應用場景無關 - 沒有特別的理由不這樣做。 EF實體是完全有效的.NET對象類 - 它們只是從一個普通的基類(EntityObject而不是object)派生出來的,它們有一定數量的「包袱」隨之而來。但是,沒有什麼能夠阻止您在應用程序中使用這些EF實體。

+0

最好的實踐可以讓你在任何一個團隊裏面做面向對象。數據層是實體框架運行時 - 不是您的業務對象。正確編碼的實體對象位於業務層。 – TomTom 2010-05-16 07:57:41

+0

TomTom - 當你說實體對象時,你的意思是「實體框架對象」嗎?你的意思是你應該在EF設計器中構建你的領域模型,並調用這些業務對象,然後使用EF將它們映射到數據庫表。 – Greg 2010-05-16 09:00:56

+6

@TomTom - 你會怎麼做? – 2010-05-17 20:53:41

1

與這種性質的所有問題一樣,答案取決於它。如果你想明確分離你的數據訪問邏輯和業務層,我會說不。如果這是您的目標,我將使用存儲庫模式和IoC構建數據訪問層,那麼您可以交換存根DAL以進行單元測試,然後在進入功能測試時引入數據庫訪問權限。

+0

如果這有幫助,我加了一點澄清... – Greg 2010-05-16 06:39:21

0

如果您需要能夠更改訪問數據庫的方式而不必重寫大量代碼,則最好將EF保留在業務層之外。您可以使用工作單元和存儲庫模式來實現此目的;通過接口訪問數據層的所有功能。 如果您丟失EF,接口保持不變,您只需更改實施類。

但是,有一些不使用UoW和存儲庫的參數,主要的是DbContext已經爲您提供了許多這些功能。

我在數據層啓動了一個UoI和存儲庫的項目,並且在業務層沒有EF引用。隨着我的進步,我覺得自己只是爲自己工作,然後放棄了。相反,我使用訪問業務層的上下文,執行我需要從DTO到業務層POCO的任何轉換。

在我的情況下,我有信心堅持使用EF。如果你不是,請考慮哪種方法適合你。