Я работаю над 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
должен использоваться для получения секретных имен в базовом классе.