简体   繁体   English

从不同项目的 appsettings.json 读取多个连接字符串

[英]Read multiple connection strings from appsettings.json from different projects

I'm using .Net core v 2.1 to create web api.我正在使用 .Net core v 2.1 来创建 web api。 My solution contains difference project layers (BLL, DAL, Common etc.) and there is one appsettings.json file in main project.我的解决方案包含不同的项目层(BLL、DAL、Common 等),并且主项目中有一个 appsettings.json 文件。 I have multiple connection strings in my appsettings.json file and I want select connection string based on the parameter passed in controller.我的 appsettings.json 文件中有多个连接字符串,我想根据控制器中传递的参数选择连接字符串。

Here is project structure and code:这是项目结构和代码:

1) api layer 1) api层

appsettings.json appsettings.json

"ConnectionStrings": {
    "CON1": "con1 connectionstring",
    "CON2": "con2 connectionstring",
    "CON3": "con3 connectionstring"
},

Startup.cs启动文件

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IConfiguration>(Configuration);
}

for eg.例如。 I'm passing conn = "CON1"我正在传递 conn = "CON1"

AccountController.cs账户控制器.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 layer 2) dal 层

AccountDL.cs账户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) common config layer 3)公共配置层

AppConfiguration.cs应用配置文件

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;
        }
    }
}

Now I'll use this dbConn connection object for further processing but I'm getting Exception as System.NullReferenceException: 'Object reference not set to an instance of an object.'现在我将使用这个 dbConn 连接对象进行进一步处理,但我收到 Exception as System.NullReferenceException: 'Object reference not set to an instance of an object.'

If i'm trying all this in same api layer then I'm getting the connection string based on the parameter passed but after restructuring my project I want use this connection in different project ie DAL, how can I get the connection string based on parameters in different projects?如果我在同一个 api 层中尝试所有这些,那么我将根据传递的参数获取连接字符串,但在重组我的项目后,我想在不同的项目(即 DAL)中使用此连接,如何根据参数获取连接字符串在不同的项目中? Thank you in advance.先感谢您。

So, you can access connection string value from appsettings.json file for GetConnection() method like this -因此,您可以从 appsettings.json 文件中为GetConnection()方法访问连接字符串值,如下所示 -

AppConfiguration.cs应用配置文件

public OracleConnection GetConnection(string conn)
{
    try
    {
        string connectionString = _configuration["ConnectionStrings:" + conn];
        OracleConnection dbConn = new OracleConnection(connectionString);
        return dbConn;
    }
    catch(Exception ex)
    {
        throw ex;
    }
}

In AccountController.cs controller, you need to inject the dependency of IConfiguration object in the constructor of that controller.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;
        }
    }
}

and therefor you also need to modify the AccountDL.cs class.为此,您还需要修改AccountDL.cs类。 You need to pass that object in the constructor or in the method parameter.您需要在构造函数或方法参数中传递该对象。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM