DbFactory常见实现思路
DbFactory Common Implementation Ideas
我正在尝试创建一个公共数据层来连接到所有公共数据库。所以我开始创建 DbFactory
class.
在创建这个工厂时我应该考虑哪些事情,比如可伸缩性、性能、安全性、连接池和可重用性。请指教
这是我开始的:
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
}
}
我建议不要这样做。使用这种方式对我来说违反了SRP and OCP from the SOLID principles at minimum. It also looks like YAGNI。
更好的方法是创建一个简单的界面,例如:
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
}
}
}
在您的应用程序的某个地方,最好是在您的应用程序的 composition root 中,您可以创建 ConnectionFactory
.
所需的实现
我正在尝试创建一个公共数据层来连接到所有公共数据库。所以我开始创建 DbFactory
class.
在创建这个工厂时我应该考虑哪些事情,比如可伸缩性、性能、安全性、连接池和可重用性。请指教
这是我开始的:
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
}
}
我建议不要这样做。使用这种方式对我来说违反了SRP and OCP from the SOLID principles at minimum. It also looks like YAGNI。
更好的方法是创建一个简单的界面,例如:
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
}
}
}
在您的应用程序的某个地方,最好是在您的应用程序的 composition root 中,您可以创建 ConnectionFactory
.