簡體   English   中英

數據庫工廠設計

[英]Database Factory Design

我正在制作一個支持多個數據庫的應用程序。 啤酒屋的體系結構使用下面的單例從正確的提供程序實例化正確的類。

  static private ArticlesProvider _instance = null;
  static public ArticlesProvider Instance
  {
     get
     {
        if (_instance == null)
           _instance = (ArticlesProvider)Activator.CreateInstance(
              Type.GetType(Globals.Settings.Articles.ProviderType));
        return _instance;
     }
  }

我將providertype存儲在我的web.config的自定義部分中,並試圖創建一個工廠,該工廠根據設置的提供程序實例化正確的DAL類。

上面的代碼目前將存儲在web.config的整個命名空間帶到相關的DAL類,並且由於它僅創建ArticlesProvider實例而受到了一些限制。 我怎樣才能建立一個通用工廠,這樣我就可以傳入要實例化的提供程序類型( 例如SqlServer)和任何類( 例如ArticleDAL)

先感謝您。

我個人會喜歡使用一個合適的依賴注入框架,我喜歡NInject 這將為您提供打破應用程序與基礎數據庫之間的依賴關系所需的所有工具。

您向框架注冊從接口到具體類型的映射。 這些映射可以在web.config中,也可以在應用程序啟動時的某些配置代碼中。 該框架將為您實例化這些類-如果需要,可以注入更多的依賴關系。

因此,您可以要求一個IArticleDAL實例,如果IArticleDAL需要一個IDbConnection實例來訪問數據庫,則NInject將自動創建一個實例並將其傳遞給IArticleDAL實現的構造函數。

無論如何,文檔會更好地解釋它……但是總而言之,您上面提取的代碼只是適當依賴注入的原始起點。

...我如何建立一個通用工廠,這樣我就可以傳入我想實例化的提供程序類型(例如SqlServer)和任何類(例如ArticleDAL)?

我認為您已經在這里了-目前您正在傳遞一個最終在web.config中設置的值-因此不是特別動態。

您可以只傳遞類標識符,而不是從web.config傳遞整個值。

我該如何建立一個通用工廠

我以前沒有做過,就像您一樣,我總是從web.config中傳遞一個值。 訣竅在於決定:決定加載哪個DAL類的責任在哪里。

它不能在業務層(BL)中-因為BL不應對數據訪問層(DAL)一無所知。

我可以嘗試進一步回答,但有了更多信息,尤其是可以闡明問題的信息,它將變得更加容易:決定加載哪個DAL類的責任在哪里?

只需消除所有這些添加了慢速和錯誤代碼的第三方層,並通過實現ProviderBase即可使用Provider模式中內置的.net框架,即由MembershipProvider使用。 該框架將處理其余的工作。

我們必須為幾個不同的數據庫編寫存儲過程,而必須為每個數據庫編寫特定的DAL卻是一個很大的麻煩,但它確實工作得很好。

我想知道為什么不使用Microsoft自己的解決方案來進行此類工作? DbProviderFactories類提供了GetFactory方法,該方法將提供程序名稱作為輸入。

如果您在web.config有提供者,那么,

var conn = DbProviderFactories.GetFactory("providerName").CreateConnection();

一旦獲得連接對象,您就可以從其中獲得幾乎所有其他內容,例如DbCommand,DbDataReader等。

您需要使用AbstractFactory模式。

數據訪問對象可能有幫助嗎? (鏈接在java中,但是概念仍然相同)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM