2010-11-02 82 views
2

我正在製作一個支持多個數據庫的應用程序。 beerhouse體系結構使用下面的單例從正確的提供者實例化正確的類。數據庫工廠設計

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; 
    } 
    } 

我有存儲自定義欄目中我web.config的providertype,我試圖建立一個工廠,實例化基礎上,集供應商正確的DAL類。

上面的代碼當前將整個名稱空間存儲在web.config中,與相關的DAL類相關,並且有點受限制,因爲它只創建ArticlesProvider的實例。我怎樣才能製造一個通用工廠,所以我可以通過例如SqlServer和任何類,例如ArticleDAL,我想實例化的提供類型

預先感謝您。

回答

3

我會考慮使用適當的依賴注入框架,我個人喜歡NInject。這將爲您提供所需的所有工具來打破應用程序和底層數據庫之間的依賴關係。

您註冊與框架的映射,從接口到具體類型。這些映射可以在web.config中,或者在應用程序啓動時的一些配置代碼中。該框架將爲您實例化這些類 - 如果需要的話,注入進一步的依賴關係。

所以你可以要求一個IArticleDAL的實例,如果IArticleDAL需要一個IDbConnection的實例來訪問一個DB,那麼NInject會自動創建一個並將它傳遞給IArticleDAL實現的構造函數。

無論如何 - 文檔解釋了它好得多......但總之,上面提取的代碼僅僅是正確的依賴注入的原始起點。

+0

嗨詹姆斯提供商, ninject看起來有趣,唯一的是我仍然在學習.Net,所以想知道學習曲線是否會有點陡峭。 – gdp 2010-11-03 15:14:19

+0

我已經仔細研究了ninject,我得到了DI背後的概念,並認爲我理解如何在我的頁面/類中使用setter注入。不過,我很好奇我將在哪裏部署它,我目前有3層UI,BL,DAL,並且正在考慮業務層。它是否正確? – gdp 2010-11-04 00:09:03

+0

geppie - 您可以在所有圖層上使用它。例如,在MVC應用程序中通常使用DI生成控制器,以便您可以自動注入構造器參數 - 例如對BL的引用。在您的存儲庫中,您可以將引用注入到DAL中。把它看作是一種打破層內依賴關係的方法 - 也可以在層之間進行。開始時可能很難解決 - 但是當你熟悉它時,你應該看到它在很多層面都有效。一旦你開始考慮單元測試,它就變得非常寶貴。 – 2010-11-04 20:27:01

0

您需要使用AbstractFactory模式。

1

...我怎樣才能使一個普通的工廠,這樣我就可以在providertype如SqlServer的任何類如ArticleDAL我希望通過實例化?

我覺得你非常有 - 此刻的你正在傳遞,最終是在web.config中設置的值 - 所以不是特別有活力。

不是從web.config傳入整個值,而是隻傳入類標識符。

...我怎樣才能使一個普通的工廠......

我沒有做過,像你我從網上值一直傳遞。配置。 訣竅在於:決定哪個DAL類被加載的責任在哪裏。

它不能在業務層(BL) - 因爲BL不應該知道關於數據訪問層(DAL)的任何信息。

我可以嘗試進一步回答,但使用更多信息會更容易一些,特別是有關以下問題的信息:決定將哪些DAL類加載的責任在哪裏?

+0

嗨,adrian。 DAL類被加載的責任目前在我的DataAccess項目中,但是我們正在討論是否將它置於Common中。謝謝。 – gdp 2010-11-03 15:12:52

0

只要刪除所有這些第三方層,添加緩慢和錯誤的代碼,並通過實施ProviderBase(即由MembershipProvider使用)使用Provider模式中構建的.net框架。該框架將負責其餘部分。

我們必須爲幾個不同的數據庫編寫存儲過程,儘管必須爲每個數據庫編寫特定的DAL是一個很大的麻煩,但它確實很好。

0

我想知道爲什麼不使用Microsoft's own solution這種工作? DbProviderFactories類提供了將提供者名稱作爲輸入的方法GetFactory

如果你在你的web.config,那麼,

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

一旦你的連接對象,你可以得到幾乎一切從它在其他類似的DbCommand,DbDataReader等