我正在使用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"
}
有两种潜在的方法:
- 在控制器构造函数中注入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;
}
}
- 创建一个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;
}
}