Невозможно внедрить одноэлементный объект в ctor автозагрузки - PullRequest
0 голосов
/ 15 января 2020

Мне нужно добавить одноэлементный экземпляр AppSettings в конструктор моего Startup, там я установлю его начальное значение и затем будет введен в мои контроллеры MVC для использования ими. Фрагменты кода, как показано ниже.

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

Неожиданно выдается следующее исключение:

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

Как решить эту проблему?

1 Ответ

1 голос
/ 15 января 2020
  1. Запуск
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();
     }
}
Контроллер
public class MyController : ControllerBase
{
        private readonly AppSettings  _appsettings;
        public MyController(AppSettings appsettings) {
            _appsettings = appsettings;
        }

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