Перезагрузите / Перезапустите веб-приложение ASP.NET Core 2.1 - PullRequest
0 голосов
/ 03 марта 2019

У меня есть веб-приложение .NET Core 2.1, где пользователи могут выбирать поставщика базы данных по своему выбору.Это выбор между SQL Server, SQLite и MySQL (сейчас можно добавить больше провайдеров).Я сохраняю выбор пользователя в файл json вместе со строками подключения для каждого поставщика базы данных:

"ConnectionStrings": {
    "MSSQL": "Server=(localdb)\\MSSQLLocalDB;Database=ABC_db;Trusted_Connection=True;MultipleActiveResultSets=true",
    "SQLite": "Data Source=ABC.db"
  },
  "UserSettings": {
    "DatabaseProvider": "MSSQL", //this changes as per user's selection
    "GenerateDb": false //this will be false for the first time, after that it will be true
  }

И в моем методе ConfigureServices в Startup.cs я поместил несколько проверок для регистрации / внедрения базы данных.контекст и идентификация:

GenerateDb = Configuration.GetValue<bool>("GenerateDb");
            DatabaseProvider = Configuration.GetValue<string>("SystemSettings:SystemProfile:DatabaseProvider");
            if(GenerateDb)
            {


                if (DatabaseProvider == "MSSQL")
                    services.AddDbContext<ApplicationDbContext>(options => 
                    options.UseSqlServer(Configuration.GetConnectionString(DatabaseProvider)));

                else if (DatabaseProvider == "SQLite")
                    services.AddDbContext<ApplicationDbContext>(options =>   options.UseSqlite(Configuration.GetConnectionString(DatabaseProvider)));

                services.AddDefaultIdentity<IdentityUser>()
                    .AddEntityFrameworkStores<ApplicationDbContext>();
            }

, и этот код работает как положено, он устанавливает контекст базы данных с любым провайдером, которого выбрал пользователь.Единственная проблема заключается в том, что для активации контекста базы данных, мне нужно остановить и запустить приложение снова, поэтому, когда оно читает файл json, GenerateDb будет истинным.Я ищу что-то, что может помочь мне перезапустить приложение, не делая этого вручную.Доступна ли эта функциональность?Я ничего не мог найти в документах.

1 Ответ

0 голосов
/ 03 марта 2019

Можно было бы зарегистрировать 2 разные реализации ApplicationDbContext.

Сначала создайте новые классы (они могут быть пустыми реализациями, это не имеет значения)

public class SQliteApplicationDbContext : ApplicationDbContext {}
public class SqlServerApplicationDbContext : ApplicationDbContext {}

Затем зарегистрируйте их следующим образом:

services.AddDbContext<SqlServerApplicationDbContext >(options => 
    options.UseSqlServer(Configuration.GetConnectionString(DatabaseProvider)));

services.AddDbContext<SQliteApplicationDbContext>(options =>   
    options.UseSqlite(Configuration.GetConnectionString(DatabaseProvider)));

services.AddScoped<ApplicationDbContext>((ctx) =>
{
    // fyi: would be better to implement the options pattern here
    DatabaseProvider = Configuration.GetValue<string>("SystemSettings:SystemProfile:DatabaseProvider");
    if (DatabaseProvider == "MSSQL")
        ctx.GetService<SqlServerApplicationDbContext >();
    else if (DatabaseProvider == "SQLite")
        ctx.GetService<SQliteApplicationDbContext>();
    else
        throw new Exception("Bad configuration");
});

Обратите внимание, что это делает предположения о том, что ядро ​​asp.net настроено на отслеживание изменений в файле json.

...