2011-02-18 88 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""); 

只要程序集包含在程序集搜索路径的其中一个文件夹中,就应该可以工作。