ASP.NET核心-创建一个单例类以在应用程序中提供连接字符串



我正在使用ADO.NET(不带实体框架(创建ASP.NET核心Web API。我需要一个singleton类来为所有控制器提供连接字符串
我已经完成了以下操作。

  • 将类DBUtils定义为只有一个公共属性DBConnectionString
  • 尝试在startup.cs中将该类注册为singleton
  • 通过每个控制器中的DI使用类来访问连接字符串

public class DBUtils
{
public string DBConnectionString { get; set; }
public DBUtils(string connectionString)
{
this.DBConnectionString = connectionString;
}
}

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<DBUtils>();
services.AddControllers();
}
}

public class CommonController : ControllerBase
{
private string conStr;
public CommonController(DBUtils utils)
{
conStr = utils.DBConnectionString;
}
public IActionResult GetData() {
SqlConnection connection = new SqlConnection(conStr);
//Get dat from the database
return null;
}
}

现在的问题是我无法将连接字符串传递给DBUtils构造函数。我从其他帖子中读到,我们不应该对Singleton类使用参数。但我的类只有一个参数,并且在执行过程中永远不会更改。它从配置文件中获取连接字符串。

请帮助我如何将连接字符串传递给我的控制器。我不想直接在控制器类中将IConfiguration用作DI。


更新:我意识到Singleton不是满足我需求的方法,正如@Ceemah Four建议的那样,我们应该使用Options Pattern。谢谢

这个场景已经在dotnet核心中得到了满足。不需要创建DBUtils类。也不需要设置Singleton DI等

假设这是您的appsettings.json

"ConnectionStrings": {
"SqlDatabase":  "connection string here"
}

有两种潜在的方法:

  1. 在控制器构造函数中注入IConfiguration-您可以简单地从注入的配置中访问连接字符串值
public class CommonController : ControllerBase
{
private readonly IConfiguration _config;
private string conStr;
public CommonController(IConfiguration config)
{
_config = config;
}
public IActionResult GetData()
{
SqlConnection connection = new SqlConnection(_config.GetConnectionString("SqlDatabase"));
//Get data from the database
return null;
}
}
  1. 创建一个Settings类,在Startup中绑定Settings类,并在控制器构造函数中注入Settings类。这使用IOPs模式*,是一种更干净、推荐的方法*
public class ConnectionSettings
{
public string SqlDatabase { get; set; }
}

在您的启动.cs:

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConnectionSettings>(Configuration.GetSection("ConnectionStrings"));
services.AddControllers();
}
}

然后在您的控制器中:

public class CommonController : ControllerBase
{
private readonly IOptions<ConnectionSettings> _connectionSettings;
public CommonController(IOptions<ConnectionSettings> connectionSettings)
{
_connectionSettings = connectionSettings;
}
public IActionResult GetData()
{
SqlConnection connection = new SqlConnection(_connectionSettings.Value.SqlDatabase));
//Get data from the database
return null;
}
}

最新更新