C# DbFactory通用实现思想

C# DbFactory通用实现思想,c#,database,factory,dbconnection,C#,Database,Factory,Dbconnection,我试图创建一个公共数据层来连接所有公共数据库。因此,我开始创建一个DbFactory类 在创建这个工厂时,我应该考虑什么样的事情,比如可扩展性、性能、安全性、连接池和可重用性。请告知 以下是我的开始: public class DbFactory { private DbConnection _dbConnection; public DbConnection GetDbConnection(DbType type) { switch (type)

我试图创建一个公共数据层来连接所有公共数据库。因此,我开始创建一个
DbFactory

在创建这个工厂时,我应该考虑什么样的事情,比如可扩展性、性能、安全性、连接池和可重用性。请告知

以下是我的开始:

public class DbFactory
{
    private DbConnection _dbConnection;

    public DbConnection GetDbConnection(DbType type)
    {
        switch (type)
        {
            case (DbType.Oracle):
                _dbConnection = new OracleConnection();
                break;
            case (DbType.SqlServer):
                _dbConnection = new SqlConnection();
                break;
            case (DbType.Excel):
                _dbConnection = new OleDbConnection();
                break;
            case (DbType.Other):
                _dbConnection = new OdbcConnection();
                break;
            default:
                _dbConnection = new OdbcConnection();
                break;
        }

        return _dbConnection;
    }

    public enum DbType
    {
        SqlServer,
        Oracle,
        Excel,
        Other
    }
}

我建议不要这样做。使用这种方法至少违反了原则。在我看来也是这样

更好的方法是创建一个简单的界面,如:

public interface IConnectionFactory
{
    DbConnection GetNewConnection();
}
您可以根据需要的数据库类型创建一个实现。 对于SQL,这看起来像:

public class SqlConnectionFactory : IConnectionFactory
{
    private readonly string connectionString;

    public SqlConnectionFactory(string connectionString)
    {
         this.connectionString = connectionString;
    }

    public DbConnection GetNewConnection()
    {
         return new SqlConnection(this.connectionString);
    }
}
根据您正在使用的当前应用程序,您可以在此时注入所需的正确实现。例如:

public class SomeServiceNeedingDatabaseConnection
{
     private readonly IConnectionFactory connectionFactory;

     public SomeServiceNeedingDatabaseConnection(IConnectionFactory connectionFactory)
     {
          this.connectionFactory = connectionFactory;
     }

     public void SomeMethodNeedingDatabase()
     {
          using (var connection = this.connectionFactory.GetNewConnection())
          {
                 // Do something with connection
          }
     }
}

在应用程序的某个地方,最好是在应用程序的另一个地方,您可以创建所需的
连接工厂实现

,我建议不要这样做。使用这种方法至少违反了原则。在我看来也是这样

更好的方法是创建一个简单的界面,如:

public interface IConnectionFactory
{
    DbConnection GetNewConnection();
}
您可以根据需要的数据库类型创建一个实现。 对于SQL,这看起来像:

public class SqlConnectionFactory : IConnectionFactory
{
    private readonly string connectionString;

    public SqlConnectionFactory(string connectionString)
    {
         this.connectionString = connectionString;
    }

    public DbConnection GetNewConnection()
    {
         return new SqlConnection(this.connectionString);
    }
}
根据您正在使用的当前应用程序,您可以在此时注入所需的正确实现。例如:

public class SomeServiceNeedingDatabaseConnection
{
     private readonly IConnectionFactory connectionFactory;

     public SomeServiceNeedingDatabaseConnection(IConnectionFactory connectionFactory)
     {
          this.connectionFactory = connectionFactory;
     }

     public void SomeMethodNeedingDatabase()
     {
          using (var connection = this.connectionFactory.GetNewConnection())
          {
                 // Do something with connection
          }
     }
}

在应用程序的某个地方,最好是在应用程序的另一个地方,您可以创建所需的
连接工厂的实现

我建议您看看DBProviderFactorys:我建议您看看DBProviderFactorys: