2009-07-17 96 views
1

後面的故事到這是一個同事不喜歡我們的企業庫數據訪問塊標準化因爲企業庫數據訪問塊設計決策

  • 它需要在這需要每一個項目太多引用的事實數據庫訪問
  • 我們並不需要它提供的所有功能
  • 他認爲DbCommand/SqlCommand應該內部存儲在數據庫對象中,而不必讓數據庫構建一個sqlcommand並要求用戶管理其狀態外部
  • 他不喜歡在添加參數時必須指定類型,他認爲重載應該爲您推斷出類型。 *不喜歡那個企業庫是通用的所有數據庫,當我們的系統顯然只是永遠將是兼容的SQL服務器反正

我個人想使用企業庫,而不是他的家溶液生長保持,但它的確讓我提出了一些問題。

爲什麼企業庫或其他數據庫抽象層爲基本類型提供AddParameter重載?

db.AddInParameter(dbCommand, 
    "EmployeeID", DbType.Int32, 1); 

會是什麼原因,或者一些原因,他們不只是提供如int所有的數據類型重載,而不是僅考慮對象,並強制用戶指定類型。

db.AddInParameter(dbCommand, "EmployeeID", 1); 

,我能想到的是一些原因...

如果不指定每一個類型映射爲過載以下情況可能發生。

比方說你有INT過載而不是char

char c = 'R' 

db.AddInParameter(dbCommand, "Initial", c); 

編譯器將解決超載爲int而不是char和因爲存儲過程expeected類型是char拋出一個錯誤。

另一個含義是,如果我想模擬數據庫類,我現在有一個重載的接口,我需要實現而不是一個。

我的另一大問題是... ...

爲什麼數據訪問塊需要檢索命令對象,然後傳回在後續調用,而不是僅僅在內部管理其狀態?

using (var cmd = db.GetStoredProcCommand("AddEmployee")) 
{ 
     db.AddInParameter(cmd, "@Name", DbType.String, name); 

代替

using(var db = new Database()) 
{ 

     db.CreateStoredProcCommand("AddEmployee") 

     db.AddInParameter("@Name", DbType.String, name); 

我希望看到你們的想法。

感謝

回答

4

第一個問題:

這只是一個猜測,但我懷疑這是因爲ADO.NET不提供該功能。

第二個問題:

DbCommands是數據庫供應商特定的,所以你需要一個工廠方法某處實例化它們。

至於將命令及其參數存儲在數據庫對象中,數據庫對象被設計爲不包含命令特定的狀態。這使他們能夠重複使用。常見的模式是在應用程序啓動時實例化一個Database對象,並在應用程序的生命週期中根據需要調用它的GetXXXCommand()方法。而且,多線程應用程序(例如網站)可以安全地從單個數據庫對象實例化DbCommands,即使在服務許多併發請求時也是如此。

如果數據庫對象存儲了隱式DbCommand,則數據庫實例的跨線程共享將不再可能。

最後,即使在單線程應用程序中,構造多個DbCommand也是完全可能的,或者在調用GetXXXCommand()和調用ExecuteXXX()之間不存在一對一映射。例如,您可以多次執行它們,每次使用不同的參數。

0

注意,企業庫數據訪問塊是不是一個新的數據訪問框架,它是正常的ADO.NET其中做了很多的東西你在大型企業應用所需的自動包裝。所以它只保存一些代碼行。背後的技術仍然是簡單的ADO.NET。 所以,請你能提供一些關於你的問題的更多信息嗎?據我所見,你只是不喜歡企業庫數據訪問塊的API語法。