web-dev-qa-db-fra.com

Stocker / récupérer ConnectionString depuis appSettings.json dans l'application ASP.net Core 2 MVC

Je recherche la meilleure méthode pour stocker une chaîne de connexion dans appsettings.json dans une application MVC .net Core 2 (comme vous le faites sur le Web .config dans MVC 5).

Je veux utiliser Dapper et non EF (j'ai trouvé de nombreux exemples EF).

Quelque chose comme ça:

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

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

Il y a sûrement de nombreux exemples en ligne? Rien que je puisse trouver qui soit pour .net core 2.0.

Plusieurs choses ont changé entre 1 et 2 et je veux m'assurer d'utiliser les meilleures pratiques de la version 2.

J'ai trouvé cela - mais il semble être .net core 1: Visual Studio 2017 - MVC Core - Part 05 - Connection String from appsettings.json

Cela utilise des paramètres de paire de valeurs clés - pas les chaînes de connexion: Lire les paramètres d'application dans ASP.NET Core 2.

Encore une fois, il n'est pas clair s'il s'agit de .net Core 1 ou 2: Net Core Connection String Dapper visual studio 2017

8
niico

Définissez vos chaînes de connexion dans appsettings.json

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

Lisez sa valeur au démarrage

Si vous suivez la convention et définissez vos chaînes de connexion sous connectionStrings, vous pouvez utiliser la méthode d'extension GetConnectionString() pour lire sa valeur.

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

        // ...
    }
}

Utiliser IDbConnection dans le référentiel?

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

Vous avez juste besoin de la chaîne de connexion dans un POCO?

Vous pouvez utiliser le modèle d'options .

  1. Définissez une classe qui correspond exactement à la structure d'objet JSON dans appsettings.json

    public class ConnectionStringConfig
    {
        public string AppDbConnection { get; set; }
    }
    
  2. Enregistrez cette configuration au démarrage

    public void ConfigureServices(IServiceCollection services)
    {
       // ...
    
       services.Configure<ConnectionStringConfig>(
           this.Configuration.GetSection("connectionStrings")
       );
    
       // ...
    }
    
  3. Recevez l'accesseur dans votre POCO

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

Remarques:

  1. Voir mes exemples de codes sur la façon de lire les valeurs de appsettings.json à la fois sur Core 1.x et 2.0.
  2. Voir comment j'ai configuré si vous avez plus d'une chaîne de connexion.
11
David Liang

Mettez simplement comme indiqué ci-dessous dans appsettings.json.

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

Dans Startup.cs, récupérez-le comme mentionné ci-dessous:

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

Utilisez l'injection de dépendance pour injecter la configuration dans le contrôleur comme mentionné ci-dessous:

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

    public MyController(IConfiguration configuration) 
    {
        _configuration = configuration;

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