C# 从不同项目的appsettings.json读取多个连接字符串
我正在使用.NETCore2.1创建WebAPI。我的解决方案包含不同的项目层(BLL、DAL、Common等),主项目中有一个appsettings.json文件。我的appsettings.json文件中有多个连接字符串,我希望根据传入控制器的参数选择连接字符串C# 从不同项目的appsettings.json读取多个连接字符串,c#,asp.net-core,.net-core,asp.net-core-webapi,core-api,C#,Asp.net Core,.net Core,Asp.net Core Webapi,Core Api,我正在使用.NETCore2.1创建WebAPI。我的解决方案包含不同的项目层(BLL、DAL、Common等),主项目中有一个appsettings.json文件。我的appsettings.json文件中有多个连接字符串,我希望根据传入控制器的参数选择连接字符串 public class AccountController { public IConfiguration _configuration { get; } public AccountController(ICo
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;
}
}
}
以下是项目结构和代码:
1)api层
appsettings.json
"ConnectionStrings": {
"CON1": "con1 connectionstring",
"CON2": "con2 connectionstring",
"CON3": "con3 connectionstring"
},
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
}
[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;
}
}
public class AccountDL
{
IConfiguration _configuration;
OracleConnection _oracleConnection;
public string CreateUser(string conn, string username)
{
AppConfiguration appConfg = new AppConfiguration(_configuration);
_oracleConnection = appConfg.GetConnection(conn);
}
}
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;
}
}
}
public OracleConnection GetConnection(string conn)
{
try
{
string connectionString = _configuration["ConnectionStrings:" + conn];
OracleConnection dbConn = new OracleConnection(connectionString);
return dbConn;
}
catch(Exception ex)
{
throw ex;
}
}
2)dal层
AccountDL.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
}
[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;
}
}
public class AccountDL
{
IConfiguration _configuration;
OracleConnection _oracleConnection;
public string CreateUser(string conn, string username)
{
AppConfiguration appConfg = new AppConfiguration(_configuration);
_oracleConnection = appConfg.GetConnection(conn);
}
}
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;
}
}
}
public OracleConnection GetConnection(string conn)
{
try
{
string connectionString = _configuration["ConnectionStrings:" + conn];
OracleConnection dbConn = new OracleConnection(connectionString);
return dbConn;
}
catch(Exception ex)
{
throw ex;
}
}
3)公共配置层
AppConfiguration.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
}
[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;
}
}
public class AccountDL
{
IConfiguration _configuration;
OracleConnection _oracleConnection;
public string CreateUser(string conn, string username)
{
AppConfiguration appConfg = new AppConfiguration(_configuration);
_oracleConnection = appConfg.GetConnection(conn);
}
}
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;
}
}
}
public OracleConnection GetConnection(string conn)
{
try
{
string connectionString = _configuration["ConnectionStrings:" + conn];
OracleConnection dbConn = new OracleConnection(connectionString);
return dbConn;
}
catch(Exception ex)
{
throw ex;
}
}
现在,我将使用此dbConn连接对象进行进一步处理,但得到的异常为System.NullReferenceException:“对象引用未设置为对象的实例。”
如果我在同一个api层中尝试所有这些,那么我将根据传递的参数获取连接字符串,但在重新构造我的项目后,我希望在不同的项目(即DAL)中使用此连接,如何根据不同项目中的参数获取连接字符串?
提前感谢。因此,您可以从appsettings.json文件中访问连接字符串值,以获得类似以下方法的
GetConnection()-
AppConfiguration.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
}
[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;
}
}
public class AccountDL
{
IConfiguration _configuration;
OracleConnection _oracleConnection;
public string CreateUser(string conn, string username)
{
AppConfiguration appConfg = new AppConfiguration(_configuration);
_oracleConnection = appConfg.GetConnection(conn);
}
}
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;
}
}
}
public OracleConnection GetConnection(string conn)
{
try
{
string connectionString = _configuration["ConnectionStrings:" + conn];
OracleConnection dbConn = new OracleConnection(connectionString);
return dbConn;
}
catch(Exception ex)
{
throw ex;
}
}
在AccountController.cscontroller中,需要将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);
}
}
@我已经修改了我的答案。请检查一下,让我知道。