У меня есть 3 решения. Project.Web, Project.Core (бизнес) и Project.Layer (модели).

В Project.Core у меня есть статический файл, который я могу назвать следующим образом Business.GetAllData(); из Project.Web.Controller.

Это вызывает файлы DAL / EF и получает данные (BusinessDal.GetData()).

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

В моей конфигурации / 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 показывает, как это читать с контроллеров. И эта часть работает нормально, я могу прочитать свои настройки на контроллерах. Однако я не уверен, как передать его в другой проект и по-прежнему иметь возможность вызывать его из статического класса.

11
FerX32 2 Янв 2018 в 08:46

2 ответа

Лучший ответ

Я чувствую, что это может быть больше работы, чем необходимо, но я тороплюсь, так что это то, к чему я пока иду. Не стесняйтесь размещать другие решения по мере их появления.

Я создаю еще один статический класс 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;
}

P.S. Я попробовал метод внедрения зависимостей в DbContext (с помощью конструкторов). Однако это не сработало для меня, потому что я вызывал DbContext из статического файла, поэтому DbContextOptions терялся.

19
FerX32 2 Янв 2018 в 06:23

Немного более короткая версия, основанная на том же принципе, что и выше:

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

Для использования в другом классе static:

string connString = Startup.StaticConfig.GetConnectionString("DefaultConnection");
11
Unheilig 7 Ноя 2018 в 00:26