在單獨的數據訪問&業務邏輯層,我可以在業務層使用實體框架類嗎?在單獨的數據訪問和業務邏輯層中,我可以在業務層中使用實體框架類嗎?
編輯:我不認爲我將來需要從我的業務邏輯中交換數據訪問層(即將SQL Server),但是我會爲UI層。因此,這個問題更多的意味着是否在業務層使用EF類有任何主要問題?似乎會有更少的管道代碼。
在單獨的數據訪問&業務邏輯層,我可以在業務層使用實體框架類嗎?在單獨的數據訪問和業務邏輯層中,我可以在業務層中使用實體框架類嗎?
編輯:我不認爲我將來需要從我的業務邏輯中交換數據訪問層(即將SQL Server),但是我會爲UI層。因此,這個問題更多的意味着是否在業務層使用EF類有任何主要問題?似乎會有更少的管道代碼。
通常情況下,「最佳實踐」的做法是這樣的:在您的數據層
,你有獲得來自加載並存儲到數據庫中
在EF實體你的業務層,你有你自己的域對象(只是簡單的C#類),代表你的應用程序需要處理的數據。這些可以或多或少與數據層實體相同,或者它們可以包含幾個「原子」實體來組成業務對象,或者它們可以有很大的不同。爲了減少對左右手賦值語句的大量需求(在數據層實體和業務層對象之間來回移動屬性值),您應該查看諸如AutoMapper之類的工具,這些工具可以很容易地設置一個類似的對象類型之間的「映射」,讓你輕鬆地分配這些類型來回
你的UI層(一個或多個),然後將可視化和表示業務層對象給用戶的信息和/或操縱
好處是您的業務層領域模型代表您正在使用的實際業務對象,並且變得或多或少獨立於這些真的存儲在數據層中。而且,這樣可以避免將UI層「粘合」到特定的數據訪問技術。
當然 - 這是一個企業級的應用程序,你可能需要換出數據訪問層等。對於一個簡單的應用程序推薦的最佳實踐,您可能會跳過這些做法,知道你在做什麼這樣做,並且如果您將EF實體貫穿業務層一直使用到UI中,那麼您將自己「鎖定」到EF中。如果這與你和你的應用場景無關 - 沒有特別的理由不這樣做。 EF實體是完全有效的.NET對象類 - 它們只是從一個普通的基類(EntityObject
而不是object
)派生出來的,它們有一定數量的「包袱」隨之而來。但是,沒有什麼能夠阻止您在應用程序中使用這些EF實體。
與這種性質的所有問題一樣,答案取決於它。如果你想明確分離你的數據訪問邏輯和業務層,我會說不。如果這是您的目標,我將使用存儲庫模式和IoC構建數據訪問層,那麼您可以交換存根DAL以進行單元測試,然後在進入功能測試時引入數據庫訪問權限。
如果這有幫助,我加了一點澄清... – Greg 2010-05-16 06:39:21
如果您需要能夠更改訪問數據庫的方式而不必重寫大量代碼,則最好將EF保留在業務層之外。您可以使用工作單元和存儲庫模式來實現此目的;通過接口訪問數據層的所有功能。 如果您丟失EF,接口保持不變,您只需更改實施類。
但是,有一些不使用UoW和存儲庫的參數,主要的是DbContext已經爲您提供了許多這些功能。
我在數據層啓動了一個UoI和存儲庫的項目,並且在業務層沒有EF引用。隨着我的進步,我覺得自己只是爲自己工作,然後放棄了。相反,我使用訪問業務層的上下文,執行我需要從DTO到業務層POCO的任何轉換。
在我的情況下,我有信心堅持使用EF。如果你不是,請考慮哪種方法適合你。
我真的好奇聽到更多關於這個問題。我很想看看TomTom如何解決這個問題。 – 2010-05-17 20:53:22