[英]Read multiple connection strings from appsettings.json from different projects
我正在使用 .Net core v 2.1 来创建 web api。 我的解决方案包含不同的项目层(BLL、DAL、Common 等),并且主项目中有一个 appsettings.json 文件。 我的 appsettings.json 文件中有多个连接字符串,我想根据控制器中传递的参数选择连接字符串。
这是项目结构和代码:
1) api层
appsettings.json
"ConnectionStrings": {
"CON1": "con1 connectionstring",
"CON2": "con2 connectionstring",
"CON3": "con3 connectionstring"
},
启动文件
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
}
例如。 我正在传递 conn = "CON1"
账户控制器.cs
[HttpPost]
[Route("CreateUser")]
public IActionResult CreateUser(string conn, string username)
{
try
{
AccountDL objAccountDL = new AccountDL(); //call account data layer
objAccountDL.CreateUser(conn, username); //conn = "CON1"
return Ok();
}
catch(Exception ex)
{
throw ex;
}
}
2) dal 层
账户DL.cs
public class AccountDL
{
IConfiguration _configuration;
OracleConnection _oracleConnection;
public string CreateUser(string conn, string username)
{
AppConfiguration appConfg = new AppConfiguration(_configuration);
_oracleConnection = appConfg.GetConnection(conn);
}
}
3)公共配置层
应用配置文件
public class AppConfiguration
{
public IConfiguration _configuration { get; }
public AppConfiguration(IConfiguration configuration)
{
_configuration = configuration;
}
public OracleConnection GetConnection(string conn)
{
try
{
string connectionString = _configuration.GetSection("ConnectionStrings").GetSection(conn).Value;
OracleConnection dbConn = new OracleConnection(connectionString);
return dbConn;
}
catch(Exception ex)
{
throw ex;
}
}
}
现在我将使用这个 dbConn 连接对象进行进一步处理,但我收到 Exception as System.NullReferenceException: 'Object reference not set to an instance of an object.'
如果我在同一个 api 层中尝试所有这些,那么我将根据传递的参数获取连接字符串,但在重组我的项目后,我想在不同的项目(即 DAL)中使用此连接,如何根据参数获取连接字符串在不同的项目中? 先感谢您。
因此,您可以从 appsettings.json 文件中为GetConnection()
方法访问连接字符串值,如下所示 -
应用配置文件
public OracleConnection GetConnection(string conn)
{
try
{
string connectionString = _configuration["ConnectionStrings:" + conn];
OracleConnection dbConn = new OracleConnection(connectionString);
return dbConn;
}
catch(Exception ex)
{
throw ex;
}
}
在AccountController.cs控制器中,您需要在该控制器的构造函数中注入IConfiguration
对象的依赖项。
public class AccountController
{
public IConfiguration _configuration { get; }
public AccountController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost]
[Route("CreateUser")]
public IActionResult CreateUser(string conn, string username)
{
try
{
AccountDL objAccountDL = new AccountDL(_configuration); //call account data layer
objAccountDL.CreateUser(conn, username); //conn = "CON1"
return Ok();
}
catch(Exception ex)
{
throw ex;
}
}
}
为此,您还需要修改AccountDL.cs类。 您需要在构造函数或方法参数中传递该对象。
public class AccountDL
{
IConfiguration _configuration;
OracleConnection _oracleConnection;
public AccountDL(IConfiguration configuration)
{
_configuration = configuration;
}
public string CreateUser(string conn, string username)
{
AppConfiguration appConfg = new AppConfiguration(_configuration);
_oracleConnection = appConfg.GetConnection(conn);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.