Как передать разные контексты БД из двух производных классов в базовый класс в C# - PullRequest
0 голосов
/ 26 января 2020

Я работаю над ASP. Net Core API, который будет размещен на OnPrem или Azure.

У меня есть два контекста БД, KeyVaultDB и SQLDB. Оба имеют одинаковые таблицы.

У меня есть интерфейс:

public interface ISecretsProvider
{
    Dictionary<string,string> GetSecretNames(string env);
    string GetSecret(string key);
    bool SecretsExistForEnv(string ev);
}

Это реализовано в базовом классе:

public class SecretsProvider : ISecretsProvider
{
    public Dictionary<string,string> GetSecretNames(string env)
    {
        var result = _context.KeyVaultVersions.Select();
        ...
        ...
    }

    public virtual string GetSecret(string key)
    {
        throw new NotImplementedException();
    }

    public bool SecretsExistForEnv(string env)
    {
        var result = _context.KeyVautlVersions.Select();
        ...
        ...
    }
}

У меня есть два производных класса:

public class KeyVaultSecretProvider : SecretsProvider
{
    public override string GetSecret(string key)
    {
        ....
        ...
    }
}

public class SQLSecretProvider : SecretsProvider
{
    public override string GetSecret(string key)
    {
        ....
        ...
    }
}

В моем Startup.CS, основанном на переменной среды, я делаю внедрение зависимостей любого из производных классов:

var envVariable = Environment.GetEnvironmentVariable("");

if(envVariable.Equals("true")
{
    services.AddTransient<IsecretsProvider, KeyVaultSecretProvider>();
}
else
{
    services.AddTransient<IsecretsProvider, SQLSecretProvider>();
}

И в другом классе:

public class ConfigProvider
{
    private ISecretsProvider _secretsProvider;

    public ConfigProvider(ISecretsProvider provider)
    {
        _secretsProvider = provider;
    }

    public JObject GetConfig(string env)
    {
        var result = _secretsProvider.GetSecretNames(env);
        ...
        ...
    }
}

I не знаю, как назначить _context в базовом классе. При запуске, если введено KeyVaultSecretsProvider, контекст KeyVaultDB должен использоваться для получения секретных имен в базовом классе.

Если внедрено SQLSecretsProvider, контекст SQLDB должен использоваться для получения секретных имен в базовом классе.

...