Justinus Hermawan
Justinus Hermawan

Reputation: 1214

Cannot inject a singleton object into Startup's ctor

I need to inject a singleton AppSettings instance into my Startup's constructor, in there I'll set its initial value and will be injected then into my MVC controllers to be used by those. The snippet codes as below.

public Startup(IConfiguration configuration, AppSettings appSettings)
{
     Configuration = configuration;

     appSettings.cacheDirPath = Path.Combine(Directory.GetCurrentDirectory(),
     Configuration.GetValue<string>("GitLab:cache_dir_name"));
     DirectoryInfo di = new DirectoryInfo(appSettings.cacheDirPath);
     if (!di.Exists)
     {
          di.Create();
     }
}

public AppSettings AppSettings { get; set; }

public void ConfigureServices(IServiceCollection services)
{
     ...
     services.AddSingleton<AppSettings>();
}

Unexpectedly, it throws an exception like this:

2020-01-13 16:35:15.0945||ERROR|App.Program|Stopped program because of exception System.InvalidOperationException: Unable to resolve service for type 'App.AppSettings' while attempting to activate 'App.Startup'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass12_0.<UseStartup>b__0(HostBuilderContext context, IServiceCollection services)
   at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()

How to resolve this issue?

Upvotes: 1

Views: 221

Answers (1)

Mohamed Farouk
Mohamed Farouk

Reputation: 1107

  1. Startup
public Startup(IConfiguration configuration, AppSettings appSettings)
{
     Configuration = configuration;
}

public AppSettings AppSettings { get; set; }

public void ConfigureServices(IServiceCollection services)
{
     AppSettings = new AppSettings();
     Configuration.GetSection("AppSettings").Bind(AppSettings); //if it is section in settings or else bind all json data
     AppSettings.cacheDirPath = Path.Combine(Directory.GetCurrentDirectory(),
     Configuration.GetValue<string>("GitLab:cache_dir_name"));
     services.AddSingleton<AppSettings>(AppSettings);
     DirectoryInfo di = new DirectoryInfo(AppSettings.cacheDirPath);
     if (!di.Exists)
     {
          di.Create();
     }
}
  1. Controller
public class MyController : ControllerBase
{
        private readonly AppSettings  _appsettings;
        public MyController(AppSettings appsettings) {
            _appsettings = appsettings;
        }

        public async Task<IActionResult> Method()
        {
            var setting = _appsettings.cacheDirPath;
        }
}

Upvotes: 1

Related Questions