2011-02-18 80 views
3

負載實現我有這樣的問題:基於參數

在C#我在做應該連接到各種數據庫(SQLite的,SQL Server精簡的MS Access等)的程序。我在app.config中設置了一個名爲「dbType」的參數(它可以是1代表SQLlite,2代表SQL Server Compact,3代表MS Access等)。這個參數應該在程序運行的時候由用戶修改,用下拉菜單或者類似的東西。

然後程序讀取此參數並創建與所選數據庫相對應的數據庫接口(IDatabase)實現的實例。

的代碼是:

class ObjectDatabaseCreator 
    { 
     protected ObjectDatabase objectDb; 
     protected Object objectDAO; 
     protected int dbType; 
     protected String dbName; 

     public ObjectDatabaseCreator() 
     { 
     } 

     public ObjectDatabaseCreator(String dbName) 
     { 
      this.dbType = ObjectConfiguration.getDbType(); 
      this.dbName = dbName; 
     } 

     public ObjectDatabase getObjectDatabase() 
     { 
      //1 - SQLite; 2-SQLServer Compact; 3-SQLServer Express; 4-MS Access 


      switch (dbType) 
      { 


       case 1: 
        objectDb = new ObjectDatabase(new Database_Impl_1(dbName)); 
        break; 

       case 2: 
        objectDb = new ObjectDatabase(new Database_Impl_2(dbName)); 
        break; 

       case 3: 
        objectDb = new ObjectDatabase(new Database_Impl_3(dbName)); 
        break; 

       case 4: 
        objectDb = new ObjectDatabase(new Database_Impl_4(dbName)); 
        break; 
      } 

      return objectDb; 
     } 

    } 

嗯,看來工作,但我想知道是否有可能使其更容易添加其他的數據庫,我的意思是,是否會有另一個數據庫我應該修改這個類,重新編譯等。

我怎麼能實例化BLL類的其他實現,比方說Person,Customer等?這些也改變了,我應​​該增加更多的課程。

感謝, 狀育苗

回答

1

看看MEF ......因爲它添加目錄的概念,它可以是有用的。 在位於文件夾中的程序集中定義儘可能多的IDataBaseImplemention類,並且MEF將允許您「導入」所有找到的類。

MEF包含在.Net框架(來自V4)中,但還有很多其他框架可以完成這項工作。

0

我認爲如果業務類基於正在使用的數據庫引擎進行更改,那麼您的設計出現問題。所以我建議你的商業課程正常化。

至於數據庫的連接,你應該有,如果你想配置文件的ConnectionString部分一起使用DbProviderFactories,DbProviderFactory,等的DbConnection從System.Data.Common裝配/名稱空間 http://msdn.microsoft.com/en-us/library/9tahwysy.aspx

正確地做到這一點。 http://msdn.microsoft.com/en-us/library/ms178411(v=VS.85).aspx

如果您只想改進您的當前實現,請爲您的數據庫對象以及業務對象使用工廠。但實際上,隨着時間的推移,這會變得更加棘手。

+0

感謝大家的快速解答。 – trav 2011-02-18 12:23:30

0

您可以將整數值中的映射添加到類類型中。類似這樣的東西(未經測試):

// initialization somewhere: 
Dictionary<int,Type> databases = new Dictionary<int,Type>(); 
databases.Add(1, Database_Impl_1); 
databases.Add(2, Database_Impl_2); 
// ... 
// then later, in getObjectDatabase() 
objectDb = new ObjectDatabase(databases[settingValue]); 

谷歌反轉控制 - 有框架。

0

最常用的方法是讓用戶指定應該加載的類型assembly qualified name。您可以創建一個對象的實例給它的類型名稱中使用這樣的事情:

IDatabase GetDatabase(string typeName) 
{ 
    var databaseType = Type.GetType(typeName); 
    if (databaseType == null) 
    { 
     return null; 
    } 
    return (IDatabase)Activator.CreateInstance(databaseType); 
} 

這就使用戶可以指定相當多的IDatabase任何實現 - 包括包含在用戶提供的組件的:

IDatabase db = GetDatabase("EnterpriseLib.XmlDatabase, EnterpriseLib.XmlDatabase, Version=1.42.0.0, Culture=neutral, PublicKeyToken=AAAAAAAAAAAAAAAA""); 

只要程序集包含在程序集搜索路徑的其中一個文件夾中,就應該可以工作。