Читать несколько строк подключения из appsettings.json из разных проектов - PullRequest
2 голосов
/ 14 марта 2019

Я использую .Net core v 2.1 для создания веб-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) dal layer

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 для дальнейшей обработки, но я получаю Exception как System.NullReferenceException: «Ссылка на объект не установлена ​​на экземпляр объекта.»

Если я пытаюсь всеэто в том же уровне API, то я получаю строку подключения на основе переданного параметра, но после реструктуризации моего проекта я хочу использовать это подключение в другом проекте, например DAL, как я могу получить строку подключения на основе параметров в разных проектах?Заранее спасибо.

1 Ответ

1 голос
/ 14 марта 2019

Таким образом, вы можете получить доступ к значению строки подключения из файла 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);
    }
}
...