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

4

我正在使用.NET Core v2.1创建Web API。我的解决方案包含不同的项目层(BLL,DAL,Common等),并且在主项目中有一个appsettings.json文件。我的appsettings.json文件中有多个连接字符串,并且我想根据控制器中传递的参数选择连接字符串。

以下是项目结构和代码:

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

例如,我正在传递 conn = "CON1"

AccountController.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) 数据访问层

AccountDL.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) 通用配置层

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

现在我将使用这个dbConn连接对象进行进一步处理,但是我遇到了异常:System.NullReferenceException:“未将对象引用设置到对象的实例”。

如果我尝试在同一个API层中执行所有操作,则会根据传递的参数获取连接字符串,但是在重组项目后,我希望在不同的项目(即DAL)中使用此连接,如何根据不同项目中的参数获取连接字符串? 提前致谢。

1个回答

1
因此,您可以像这样从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;
    }
}

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

@ShreyasPednekar - 我已经修改了我的答案。请检查并告诉我。 - Krishnraj Rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接