it-swarm.com.de

Zugriff auf Konfiguration/Einstellungen in der statischen Klasse - Asp Core

Ich habe 3 Lösungen. Project.Web, Project.Core (Business) und Project.Layer (Modelle). 

In Project.Core habe ich eine statische Datei, die ich Business.GetAllData(); von Project.Web.Controller aus aufrufen kann.

Dies ruft DAL/EF-Dateien auf und ruft Daten ab (BusinessDal.GetData()). 

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

In meiner Konfiguration/DbContext.cs habe ich Folgendes:

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

Was ich versuche zu tun, ist, Einstellungen von meinem appsettings.json zu lesen. Ich habe sichergestellt, dass die Einstellungen bei startup.cs richtig geladen werden

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

Aber was jetzt? ... MS Document zeigt, wie man es von Steuerungen liest. Und dieser Teil funktioniert gut, ich kann meine Einstellungen auf Controllern lesen. Ich bin mir jedoch nicht sicher, wie ich es an ein anderes Projekt übergeben kann und es trotzdem von einer statischen Klasse aus aufrufen kann. 

9
FerX32

Ich habe das Gefühl, dass dies mehr Arbeit als nötig sein kann, aber ich bin in Eile, also bin ich damit bis jetzt gegangen. Sie können jederzeit andere Lösungen posten, sobald diese verfügbar sind. 

Ich erstelle eine andere statische Klasse AppSettingsProvider.cs

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

Dann setze ich sie auf meine 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"];
}

Dann kann ich es aus meiner DbContext.cs aufrufen

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

P.S. Ich habe die Abhängigkeitsinjektionsmethode in DbContext ausprobiert (indem ich Konstrukteure hatte). Das funktionierte jedoch nicht für mich, da ich DbContext aus einer statischen Datei aufrief, sodass die DbContextOptions verloren gingen. 

12
FerX32

Eine etwas kürzere Version basiert auf demselben Prinzip wie oben:

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

Zur Verwendung in einer anderen static-Klasse: 

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