web-dev-qa-db-ja.com

ASP.net Core 2 MVCアプリのappSettings.jsonからConnectionStringを保存/取得する

私はベストプラクティスを探しています。ネットでの接続設定文字列を.net Core 2 MVCアプリで保存しますMVCの.config 5)。

EFではなくDapperを使用したい(多くの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コア-パート05-appsettings.jsonからの接続文字列

これは、接続文字列ではなく、キーと値のペアのappsettingsを使用します。 ASP.NET Core 2.0のAppSettingsを読み取る

繰り返しますが、これが.net Core 1か2かは不明です Net Core Connection String Dapper visual studio 2017

8
niico

_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に接続文字列が必要ですか?

Options Pattern を使用できます。

  1. Appsettings.jsonの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. Core 1.xと2.0の両方でappsettings.jsonから値を読み取る方法については、 my sample codes を参照してください。
  2. 設定方法 に複数の接続文字列がある場合を参照してください。
11
David Liang

以下に示すように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");
    }
}
1
Riddhi