c# - 在托管服务中使用时,asp.net core AppSettings 失败
问题描述
我有以下内容:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureServices(services => services.AddAutofac());
public class HostedServiceA : IHostedService
{
private readonly AppSettings appSettings;
public HostedServiceA(AppSettings appSettings)
{
this.appSettings = appSettings;
}
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddHttpClient();
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
services.AddHostedService<HostedServiceA>();
}
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<SomeService>().As<ISomeService>().SingleInstance();
}
我正在使用autofac。当我尝试运行时,出现异常并且程序无法启动:AppSettings 也在另一个服务中使用。当我从 HostedService 中删除 AppSettings 时,它可以工作。
Unhandled Exception: Autofac.Core.DependencyResolutionException: An exception was thrown while activating Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor -> ?:Microsoft.Extensions.Hosting.IHostedService[] -> Test.MicroService.MicroServices.Web.HostedServices.RatesHostedService. ---> Autofac.Core.DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Test.MicroService.MicroServices.Web.HostedServices.RatesHostedService' can be invoked with the available services and parameters:
Cannot resolve parameter 'Test.MicroService.MicroServices.Infrastructure.AppSettings appSettings' of constructor 'Void .ctor(Test.MicroService.MicroServices.Infrastructure.AppSettings)'. at Autofac.Core.Activators.Reflection.ReflectionActivator.GetValidConstructorBindings(IComponentContext context, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\Core\Activators\Reflection\ReflectionActivator.cs:line 160
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\Core\Activators\Reflection\ReflectionActivator.cs:line 120
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget) in C:\projects\autofac\src\Autofac\Core\Resolving\InstanceLookup.cs:line 118
--- End of inner exception stack trace ---
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget) in C:\projects\autofac\src\Autofac\Core\Resolving\InstanceLookup.cs:line 136
at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator) in C:\projects\autofac\src\Autofac\Core\Lifetime\LifetimeScope.cs:line 306
at Autofac.Core.Resolving.InstanceLookup.Execute() in C:\projects\autofac\src\Autofac\Core\Resolving\InstanceLookup.cs:line 85
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\Core\Resolving\ResolveOperation.cs:line 130 at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\Core\Resolving\ResolveOperation.cs:line 83
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) in C:\projects\autofac\src\Autofac\ResolutionExtensions.cs:line 1041
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) in C:\projects\autofac\src\Autofac\ResolutionExtensions.cs:line 871
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.StartAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token, String shutdownMessage)
at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsync(IWebHost host, CancellationToken token)
at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
我究竟做错了什么?
解决方案
很可能 Autofac 没有配置,或者配置没有出现在正确的位置。
该错误抱怨 Autofac 无法找到Test.MicroService.MicroServices.Infrastructure.AppSettings
该类,即使有调用
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
此调用将AppSettings
使用当前 DI 容器注册该类。这意味着必须在尝试注册服务之前配置 DI 容器。
var host = new WebHostBuilder()
.UseKestrel()
.ConfigureServices(services => services.AddAutofac())
....
.UseStartup<Startup>()
.Build();
推荐阅读
- c++ - 如何使用 void `null` 或 `empty` 类似元素扩展 C++ 结构/类
- regex - MongoDB - 从正则表达式中提取数据
- php - JSON解码数组
- java - 处理模型中条件字段的最佳方法
- visual-studio-code - vscode 语言服务器详细日志显示正在发送请求'textDocument/hover - (9)' 但服务器没有收到消息
- ruby-on-rails - 使用 capistrano 部署时找不到错误命令 webpack
- exception - FluentValidation Method Not Found 异常的原因是什么?
- npm - 松露安装问题“-bash:松露:找不到命令”
- javascript - 我正在将“Select2”安装到我的下拉列表框中,它适用于所有框,但表格中的框除外
- twig - 如何在 OpenCart 中删除客户帐户导航链接