我正在尝试向数据库发出命令,但是我希望能够连接到其他命令(例如SQL Express,PostgreSQL,SQLite)
我有一个告诉应用程序正在使用哪个数据库的设置,但是SQL代码的语法略有不同,因此我有一个Postgres类和一个SQLite类。我想做的是在不同的类中定义相同的方法并传递该类。我写了这个:
public static class DatabaseConnection
{
public static string PostgreSQLConnectionString { get; set; }
public static string SQLiteConnectionString { get; set; }
public static object Interface(string connectiontype)
{
switch (connectiontype)
{
case "PostgreSQL":
PostgresConnection postgresConnection = new PostgresConnection();
return postgresConnection;
case "SQLite":
SQLiteConnection sqliteConnection = new SQLiteConnection();
return sqliteConnection;
}
return null;
}
}
然后我想引用以下内容:
Object Connection = DatabaseConnection.Interface("PostgreSQL");
Connection.Connect()
所有类中都存在方法Connect()
。这当然是行不通的,因为该类不是直接命名的,所以我无法调用可能不存在的方法。我目前正在通过将所有方法复制到DatabaseConnection
类并在每个方法中使用switch语句来解决此问题。有没有更好的方法来达到相同的效果?
答案 0 :(得分:1)
您正在寻找Factory
模式来创建实例,并寻找interface
来实现连接:
public interface IConnection
{
void Connect();
}
public class PostgresConnection : IConnection
{
public void Connect()
{
...
}
}
public class SqliteConnection : IConnection
{
public void Connect()
{
...
}
}
public static class DatabaseConnectionFactory
{
public static string PostgreSQLConnectionString { get; set; }
public static string SQLiteConnectionString { get; set; }
public static IConnection Create(string connectiontype)
{
switch (connectiontype)
{
case "PostgreSQL":
PostgresConnection postgresConnection = new PostgresConnection();
return postgresConnection;
case "SQLite":
SQLiteConnection sqliteConnection = new SQLiteConnection();
return sqliteConnection;
}
return null;
}
}
但是,我建议您看一下EntityFramework或Dapper之类的东西,因为它们支持您可能希望使用的许多数据库类型,所以两者都更容易编写。
答案 1 :(得分:0)
我建议创建一个IRepository
接口,该接口将定义所有数据库操作,然后为不同的数据库或几个接口(例如IUserRepository
,IWorkRepository
等)定义不同的实现。
多态性比使用switch更好-您的数据库客户端可以依赖接口,并且可以使用其他数据库添加其他实现。