web-dev-qa-db-fra.com

Configuration d'accès/Paramètres sur la classe statique - Asp Core

J'ai 3 solutions. Project.Web, Project.Core (Entreprise) et Project.Layer (Modèles). 

Dans Project.Core, j'ai un fichier statique que je peux appeler comme ceci Business.GetAllData(); à partir de Project.Web.Controller.

Ceci appelle les fichiers DAL/EF et obtient les données (BusinessDal.GetData()). 

        using (DBContext db = new DBContext())
        {
            return db.GetAllData().ToPOCO();
        }

Sur ma configuration/DbContext.cs, j'ai ceci:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    #if DEBUG
        optionsBuilder.UseSqlServer(@"connstring");
    #else
        optionsBuilder.UseSqlServer(@"connstring");
    #endif
    // How do I access configuration here? Configuration["ConnectionString"]
}

Ce que j'essaie de faire, c'est de lire les paramètres de mon appsettings.json. Je me suis assuré que les paramètres sont chargés correctement sur startup.cs

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)
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

Mais maintenant quoi? ... MS Document montre comment le lire à partir des contrôleurs. Et cette partie fonctionne bien, je peux lire mes paramètres sur les contrôleurs. Cependant, je ne sais pas comment le passer à un autre projet et pouvoir toujours l'appeler depuis une classe statique. 

9
FerX32

Je pense que cela peut être plus de travail que nécessaire, mais je suis pressé et c'est ce que je vais faire jusqu'à présent. N'hésitez pas à poster d'autres solutions dès qu'elles seront disponibles. 

Je crée une autre classe statique AppSettingsProvider.cs

public static class AppSettingsProvider
{
    public static string DbConnectionString { get; set; }
    public static bool IsDevelopment { get; set; }
}

Puis je les mets sur mon Startup.cs

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)
        .AddEnvironmentVariables();
    Configuration = builder.Build();

    BuildAppSettingsProvider();
}
private void BuildAppSettingsProvider()
{
    AppSettingsProvider.ConnectionString = Configuration.GetConnectionString("DBContext");
    AppSettingsProvider.IsDevelopment = Configuration["IsDev"];
}

Ensuite, je peux l'appeler depuis mon DbContext.cs

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    string connString = AppSettingsProvider.ConnectionString;
}

P.S. J'ai essayé la méthode d'injection de dépendance dans DbContext (en ayant des constructeurs). Cependant, cela n’a pas fonctionné pour moi car j’appelais DbContext à partir d’un fichier statique; 

12
FerX32

Une version légèrement plus courte basée sur le même principe que ci-dessus:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
    StaticConfig = configuration;
}
public static IConfiguration StaticConfig { get; private set; }

Pour utiliser dans une autre classe static

string connString = Startup.StaticConfig.GetConnectionString("DefaultConnection");
2
DeanC