Сохранение / получение ConnectionString из appSettings.json в приложении ASP.net Core 2 MVC - PullRequest
0 голосов
/ 24 мая 2018

Я ищу лучший метод для хранения строки подключения в appsettings.json в приложении .net Core 2 MVC (как вы делаете это в web.config в MVC 5).

Я хочу использовать Dapper, а не EF (я нашел много примеров EF).

Примерно так:

{
  "ConnectionStrings": {
    "myDatabase": "Server=.;Database=myDatabase;Trusted_Connection=true;"
  },

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

Конечно, есть много примеров в Интернете?Ничего не могу найти для .net core 2.0.

Несколько вещей изменились между 1 и 2, и я хочу убедиться, что я использую лучшие практики версии 2.

Я нашелэто - но, похоже, ядро ​​.net 1: Visual Studio 2017 - MVC Core - часть 05 - Строка соединения из appsettings.json

При этом используются настройки приложений пары ключ-значение, а не строки соединения: Чтение AppSettings в ASP.NET Core 2.0

Опять неясно, является ли это .net Core 1 или 2: Net Core Строка подключения Строка Dapper visual studio 2017

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Определите вашу строку (и) соединения в appsettings.json

{
    "connectionStrings": {
        "appDbConnection: : "..."
    }
}

Считайте ее значение при запуске

Если вы следуете соглашению и определите свою строку (и) соединения в connectionStrings, вы можете использовать метод расширения GetConnectionString(), чтобы прочитать его значение.

public class Startup
{
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // Since you said you're using Dapper, I guess you might want to
        // inject IDbConnection?
        services.AddTransient<IDbConnection>((sp) => 
            new SqlConnection(this.Configuration.GetConnectionString("appDbConnection"))
        );

        // ...
    }
}

Использовать IDbConnection в репозитории?

public interface ISpecificationRepository
{
    Specification GetById(int specificationId);
}

public SpecificationRepository : ISpecificationRepository
{
    private readonly IDbConnection _dbConnection;

    public SpecificationRepository(IDbConnection dbConnection)
    {
        _dbConnection = dbConnection;
    }

    public Specification GetById(int specificationId)
    {
        const string sql = @"SELECT * FROM [YOUR_TABLE]
                             WHERE Id = @specId;";

        return _dbConnection
            .QuerySingleOrDefault<Specification>(sql,
                new { specId = specificationId });
    }
}

Просто нужна строка подключения в POCO?

Вы можете использовать шаблон параметров .

  1. Определить класс, который точно соответствует структуре объекта JSON в appsettings.json

    public class ConnectionStringConfig
    {
        public string AppDbConnection { get; set; }
    }
    
  2. Зарегистрируйте эту конфигурацию при запуске

    public void ConfigureServices(IServiceCollection services)
    {
       // ...
    
       services.Configure<ConnectionStringConfig>(
           this.Configuration.GetSection("connectionStrings")
       );
    
       // ...
    }
    
  3. Получите метод доступа в вашем POCO

    public class YourPoco
    {
        private readonly ConnectionStringConfig _connectionStringConfig;
    
        public YourPoco(IOptions<ConnectionStringConfig> configAccessor)
        {
            _connectionStringConfig = configAccessor.Value;
    
            // Your connection string value is here:
            // _connectionStringConfig.AppDbConnection;
        }
    }
    

Примечания:

  1. См. мои примеры кодов о том, как считывать значения из appsettings.json как в Core 1.x, так и в 2.0.
  2. См. как настроить , если у вас более 1 строки подключения.
0 голосов
/ 24 мая 2018

Просто поместите, как показано ниже, в appsettings.json.

"ConnectionStrings": {
    "DefaultConnection": "Data Source=;Initial Catalog=;Persist Security Info=True;User ID=; Password=;"
}

В Startup.cs загрузите его, как указано ниже:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }
}

Используйте внедрение зависимостей для ввода конфигурации в контроллер, напримерупоминается ниже:

public class MyController : Controller
{
    private readonly IConfiguration _configuration;
    private string connectionString;

    public MyController(IConfiguration configuration) 
    {
        _configuration = configuration;

        connectionString = _configuration.GetConnectionString("DefaultConnection");
    }
}
...