【问题标题】:Injecting a dependency before startup在启动之前注入依赖项
【发布时间】:2021-12-07 05:51:14
【问题描述】:

我想在我的 .net core 3.1 应用程序的启动中使用一种类型。

这是我要注入的类:

public class DbConnectionStringManager
{
    public readonly string ConnectionStringForDefault;

    public readonly string ConnectionStringForLogDb;

    public DbConnectionStringManager(ConnectionStringProviderFactory factory)
    {
        var defaultConnectionStringProvider = factory.Create(ConnectionString.Default);
        var logDbConnectionStringProvider = factory.Create(ConnectionString.LogDb);

        ConnectionStringForDefault = defaultConnectionStringProvider.GetConnectionString();
        ConnectionStringForLogDb = logDbConnectionStringProvider.GetConnectionString();
    }
}

我需要使用的另一个类

public class ConnectionStringProviderFactory
{
    private readonly IConfiguration _configuration;

    protected readonly AwsSecretProvider _awsSecretProvider;

    public ConnectionStringProviderFactory(IConfiguration configuration, AwsSecretProvider awsSecretProvider)
    {
        _configuration = configuration;
        _awsSecretProvider = awsSecretProvider;
    }

    public AbsConnectionStringProvider Create(ConnectionString connectionString)
        => connectionString switch
        {
            ConnectionString.Default => new DefaultConnectionStringProvider(_configuration, _awsSecretProvider),
            ConnectionString.LogDb => new LogDbConnectionStringProvider(_configuration, _awsSecretProvider),
            _ => throw new InvalidOperationException($"No ConnectionStringProvider created for requested source : {connectionString}"),
        };

    public enum ConnectionString
    {
        Default,
        LogDb
    }
}

最后

public class AwsSecretProvider
{
    private GetSecretValueResponse _response = null;

    public DatabaseSecret GetSecret(string secretName)
    {
        //Some code
    }
}

我在 Program.cs 中尝试过在启动前注入依赖项

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder
                    .ConfigureLogging((hostingContext, config) => { config.ClearProviders(); })
                    .UseKestrel(options =>
                        {
                            options.AllowSynchronousIO = true;
                            options.Limits.MinRequestBodyDataRate = null;
                        })
                    .UseIISIntegration()
                     .ConfigureServices(serviceCollection =>
                     {
                         serviceCollection.AddSingleton<AwsSecretProvider>();
                         serviceCollection.AddSingleton<ConnectionStringProviderFactory>();
                         serviceCollection.AddSingleton<DbConnectionStringManager>();
                     })
                    .UseIIS()
                    .UseStartup<Startup>();
            }));

}

当我运行应用程序时,我收到以下错误

System.InvalidOperationException: '无法解析服务类型 'Hesapkurdu.Services.Encryption.Database.DbConnectionStringManager' 在尝试激活“Hesapkurdu.WebApi.Startup”时。

【问题讨论】:

  • 我正在使用 AWS Secrets Manager(一种保险库)来存储数据库凭证@Fildor
  • 使用方法注入。您可以在Startup 类的Configure 方法上解析DbConnectionStringManager

标签: c# asp.net-core-3.1 .net-core-3.1


【解决方案1】:

基于尝试激活Startup 时发生的事实,您似乎正尝试将DbConnectionStringManager 直接注入Startup 构造函数。

那行不通。

只有以下服务可以注入Startup 使用通用主机 (IHostBuilder) 时的构造函数:

  • IWebHostEnvironment
  • IHostEnvironment
  • IConfiguration

任何服务 注册到 DI 容器可以注入 Startup.Configure方法:

例如

public void Configure(IApplicationBuilder app, DbConnectionStringManager connections) {
    //...
}

参考Dependency injection in ASP.NET Core - Services injected into Startup

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2022-08-11
    • 2020-12-20
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多