首页 > 解决方案 > 如何将不同的数据库上下文从两个派生类传递给 C# 中的基类

问题描述

我正在开发一个将托管在 OnPrem 或 Azure 上的 ASP.Net Core API。

我有两个数据库上下文,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);
        ...
        ...
    }
}

我不知道如何_context在基类中分配。在启动时,如果KeyVaultSecretsProvider被注入,则KeyVaultDB必须使用上下文来获取基类中的秘密名称。

如果SQLSecretsProvider注入,则SQLDB必须使用上下文来获取基类中的秘密名称。

标签: c#asp.net-coreinheritanceasp.net-web-apidependency-injection

解决方案


推荐阅读