web-dev-qa-db-ja.com

静的クラスの構成/設定へのアクセス-Asp Core

3つの解決策があります。 Project.Web、Project.Core(ビジネス)、およびProject.Layer(モデル)。

Project.Coreには、Project.Web.ControllerからこのBusiness.GetAllData();のように呼び出すことができる静的ファイルがあります。

これにより、DAL/EFファイルが呼び出され、data(BusinessDal.GetData())が取得されます。

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

Configuration/DbContext.csには、これがあります:

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

私がやろうとしているのは、appsettings.jsonから設定を読み取ることです。 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();
}

しかし、今何?... MS Document はコントローラーからそれを読む方法を示しています。そして、その部分は正常に動作し、コントローラーで設定を読み取ることができます。ただし、別のプロジェクトに渡す方法がわからず、静的クラスから呼び出すことができます。

11
FerX32

これは必要以上の作業かもしれないと感じていますが、私は急いでいるので、これが私がこれまで行っていることです。他のソリューションが利用可能になり次第、投稿してください。

別の静的クラスAppSettingsProvider.csを作成します

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

次に、それらを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"];
}

その後、DbContext.csから呼び出すことができます

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

追伸DbContextへの依存関係注入メソッドを試しました(コンストラクターを使用)。ただし、静的ファイルからDbContextを呼び出していたので、それは機能しませんでした。そのため、DbContextOptionsが失われていました。

16
FerX32

上記と同じ原理に基づいたわずかに短いバージョン:

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

別のstaticクラスで使用するには:

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