Reputation: 1214
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
Reputation: 1107
- 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();
}
}
- 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