формирование шаблонов при использовании внедрения зависимостей для строк подключения

У меня есть приложение, написанное на Core 2.0 с использованием EF Core. Я использую шаблон, где:

Моя проблема в том, что при создании лесов (создание представления из модели, даже если оно не имеет ничего общего с моделями EF, или создание контроллера из модели), Startup.cs/Program.cs, похоже, не работает. запустить так нет DI.

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

Короче говоря:

Используя метод 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)


Насколько я понимаю, вы можете попытаться изменить метод OnConfiguring под своим monosarsqlContext.cs для ручного получения соответствующих настроек при обработке контроллера скаффолдинга следующим образом:

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);
        }
    }
}
person Bruce Chen    schedule 14.03.2018
comment
Я тестировал строку подключения из appsettings.json по методу OnConfiguring. Для части AddAzureKeyVault вам нужно проверить, можете ли вы читать через config["sqlconnectionstring"] или config.GetConnectionString("sqlconnectionstring"). - person Bruce Chen; 16.03.2018