重新加载/重新启动ASP.NET Core 2.1 Web应用程序

时间:2019-03-03 17:22:24

标签: c# datacontext asp.net-core-2.1

我有一个.NET Core 2.1 Web应用程序,用户可以在其中选择所需的数据库提供程序。您可以在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时为true。我正在寻找可以帮助我无需手动执行就重新启动应用程序的东西。此功能可用吗?我在文档中找不到任何内容。

1 个答案:

答案 0 :(得分:0)

一种选择是注册ApplicationDbContext的2种不同实现。

首先,创建新的类(它们可以是空的实现,没关系)

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 core已配置为监视json文件中的更改。