如何在控制器 C# 中访问抽象 class 连接字符串

How to access abstract class connection string in controller c#

这里是我的摘要连接字符串 class,如何访问我的连接字符串?

public abstract class Connection
{
    public SqlConnection sqlConn = null;

    public SqlConnection GetConnection
    {
        get { return sqlConn;}
        set { value = sqlConn; }
    }

    public Connection()
    {
        string cons = ConfigurationManager.ConnectionStrings["CTXDb"].ConnectionString;
        sqlConn = new SqlConnection(cons);
   }
}

HomController.cs:

public class HomeController : ApiController
{
  //Connection db = new Connection();  /// cannot create instance of an abstract class
   public HomeController:Connection()
   {
    //Here How can i get my connection 
   }
}

首先继承Abstract Class 然后就可以使用连接字符串了... 当您必须从抽象 class 访问任何内容时,您需要继承该抽象 class 然后才能使用它。

您不能实例化一个抽象 class,而是您应该实现这个 class 然后在您的控制器中使用继承的 class。

先新建一个class

public class SqlServerConnection : Connection
{

}

然后在你的控制器中

public class HomeController : ApiController
{
    SqlServerConnection conn = new SqlServerConnection();
    internal void Getconnection
    {
        SqlConnection connection = conn.GetConnection();
    }
}

顺便说一下,如果抽象 class 用于多种连接类型(例如 Sql 服务器、Oracle 等),我建议您重新考虑您的代码,您可以轻松找到最佳实践通过搜索。

如果您不介意构造函数中没有您的代码, 使您的连接字符串成为静态变量:

static SqlConnection sqlConn = null;

public static SqlConnection GetConnection 
    => sqlConn ?? (sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["CTXDb"].ConnectionString));

或者更易读的代码:

static SqlConnection sqlConn = null;

public static SqlConnection GetConnection {
get {
    if (sqlConn == null)
    {
        string cons = ConfigurationManager.ConnectionStrings["CTXDb"].ConnectionString;
        sqlConn = new SqlConnection(cons)
    }
    return sqlConn ;
}
}

您正在寻找 C# 没有的多重继承。相反,您可以链接类型。你也应该给他们起更有意义的名字。

所以不是 Connection,而是将其命名为 SqlConnectionApiController 或其他名称,所以它看起来像这样:

public abstract class SqlConnectionApiController : ApiController
{
    // ...
}

然后你的 HomeController 可以从那个类型继承:

public class HomeController : SqlConnectionApiController 
{
    public HomeController()
    {
        var connection = base.GetConnection();
    }
}

所以继承树是这样的:

HomeController : SqlConnectionApiController : ApiController

我也会考虑不直接使用 SqlConnection,而是使用更高级别的构造,例如 ORM,例如通过 Entity Framework。