0

I have a type that I want to use in Startup of my .net core 3.1 app.

Here is the class I want to inject:

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(); } } 

Another class I need to use

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 } } 

And lastly

public class AwsSecretProvider { private GetSecretValueResponse _response = null; public DatabaseSecret GetSecret(string secretName) { //Some code } } 

I tried this at my Program.cs for injecting dependencies before startup

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>(); })); } 

When I run the app, I get the following error

System.InvalidOperationException: 'Unable to resolve service for type 'Hesapkurdu.Services.Encryption.Database.DbConnectionStringManager' while attempting to activate 'Hesapkurdu.WebApi.Startup'.'

2
  • I am using AWS Secrets Manager (a kind of vault) for storing db credentials @Fildor Commented Oct 20, 2021 at 12:24
  • Use method injection. You can resolve DbConnectionStringManager on Configure method of Startup class. Commented Oct 20, 2021 at 13:14

1 Answer 1

0

Based on the fact that it happens when trying to activate Startup, it looks like you are trying to inject DbConnectionStringManager directly into Startup constructor.

That wont work.

Only the following services can be injected into the Startup constructor when using the Generic Host (IHostBuilder):

  • IWebHostEnvironment
  • IHostEnvironment
  • IConfiguration

Any service registered with the DI container can be injected into the Startup.Configure method:

For example

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

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

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.