使用DI作为连接字符串时的脚手架

时间:2018-03-12 15:57:33

标签: asp.net-core entity-framework-core asp.net-core-2.0 azure-keyvault asp.net-mvc-scaffolding

我有an application written in Core 2.0, using EF Core。我使用的模式是:

我的问题是在做脚手架时(从模型创建一个视图,甚至一个与EF模型无关,或者从模型创建控制器的视图),Startup.cs / Program.cs似乎没有DI,所以没有。

由于周围没有连接字符串,脚手架时会出现故障。如果我将连接字符串添加到我的数据上下文类的无参数构造函数中,它就可以工作。在我提交代码之前我可以把它拿回来,但它看起来真的很危险。

简而言之:

使用添加db配置字符串的DI方法(并没有将它们写入您的应用程序)如何使脚手架工作?

编辑,一些代码。这通常是在我的应用程序中运行的,但是(我认为?)因为DI在脚手架中没有运行,所以这个构造函数不会被调用。

public monosarsqlContext(IConfiguration config)
{
    this.m_sqlConnectioNString = config["sqlconnectionstring"];
}

为了让脚手架工作,我目前需要将连接字符串复制/粘贴到此无参数构造函数中。同样,它有效,但我是一个胖手指提交,而不是将我的数据库连接字符串推送到公共github仓库。

public monosarsqlContext()
{

    this.m_sqlConnectioNString = 
    "Server=mycooldatabase.domain.com;Database=soradcool; 
    Persist Security Info=False;User ID=coolguy;Password=coolpassword";

    //only here for scaffolding, do not use
    throw new NotImplementedException("DBContext only used for 
    scaffolding, 
    make use of DI method.");

}

1 个答案:

答案 0 :(得分:0)

根据我的理解,您可以尝试修改monosarsqlContext.cs下的OnConfiguring方法,以便在处理脚手架控制器时手动检索相关设置,如下所示:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        if (string.IsNullOrEmpty(m_sqlConnectioNString))
        {
            var configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("azurekeyvault.json", false, true)
            .AddJsonFile("appsettings.json", false, true)
            .AddEnvironmentVariables();

            var config = configurationBuilder.Build();

            configurationBuilder.AddAzureKeyVault(
                $"https://{config["azureKeyVault:vault"]}.vault.azure.net/",
                config["azureKeyVault:clientId"],
                config["azureKeyVault:clientSecret"]
            );

            config= configurationBuilder.Build();
            optionsBuilder.UseSqlServer(config.GetConnectionString("sqlconnectionstring"));
        }
        else
        {
            optionsBuilder.UseSqlServer(this.m_sqlConnectioNString);
        }
    }
}