如何传递对象和访问方法?

时间:2018-10-29 14:14:52

标签: c# class

我正在尝试向数据库发出命令,但是我希望能够连接到其他命令(例如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语句来解决此问题。有没有更好的方法来达到相同的效果?

2 个答案:

答案 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接口,该接口将定义所有数据库操作,然后为不同的数据库或几个接口(例如IUserRepositoryIWorkRepository等)定义不同的实现。 多态性比使用switch更好-您的数据库客户端可以依赖接口,并且可以使用其他数据库添加其他实现。