【发布时间】:2021-04-21 14:17:43
【问题描述】:
我收到以下错误:
Autofac.Core.DependencyResolutionException:在“AerospikeClient”类型上调用构造函数“Void .ctor(System.String, Int32)”时引发异常。
下面是autofac的stacktrace:
在 Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate()
在 Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext 上下文,IEnumerable1 parameters) at Autofac.Core.Activators.Reflection.ReflectionActivator.<ConfigurePipeline>b__11_0(ResolveRequestContext ctxt, Action1 下一个)在 Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext 上下文,Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action1 下一个)在 Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) 在 Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext 上下文,Action1 next) --- End of inner exception stack trace --- at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action1 下一个)在 Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) 在 Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) 在 Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext 上下文,Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action1 下一个)在 Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) 在 Autofac.Core.Resolving.Middleware.ScopeSelectionMiddleware.Execute(ResolveRequestContext 上下文,Action1 next) at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext ctxt) at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action1 下一个)在 Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.c__DisplayClass14_0.b__1(ResolveRequestContext ctxt) 在 Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext ctxt) 在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest 请求)在 Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest 请求)在 Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest 请求)在 Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest 请求)在 Autofac.ResolutionExtensions.TryResolveService(IComponentContext 上下文,服务服务,IEnumerable1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable1 参数)在 Autofac.ResolutionExtensions.ResolveOptional(IComponentContext 上下文,类型 serviceType,IEnumerable`1 参数)在 Autofac.ResolutionExtensions.ResolveOptional(IComponentContext 上下文,类型 serviceType) 在 Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetService(类型 服务类型)在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
以下是我的注册:
builder.RegisterType<AerospikeClient>().As<IAerospikeClient>()
.WithParameter("hostname", _configuration["AerospikeHostName"])
.WithParameter("port", int.Parse(_configuration["AerospikePort"]))
.SingleInstance();
_configuration 正在传递给我的 autofac 模块,它的类型为 IConfigurationRoot。我这样做是为了可以从外部传递值。
如果我将上述注册更改为:
builder.RegisterType<AerospikeClient>().As<IAerospikeClient>()
.WithParameter("hostname", "172.27.159.44")
.WithParameter("port", 3000)
.SingleInstance();
然后它开始工作。但是我不想像那样硬编码我的价值观。然后我失去了根据不同环境覆盖它们的机会。
我在这里做错了什么?
【问题讨论】:
-
_configuration["AerospikeHostName"]返回的实际类型是什么?它实际上是string,还是恰好可以分配给字符串? -
@AlistairEvans 你的问题迫使我仔细检查
AerospikeHostName的返回值。原来它前面有一个“”(空格)。修复了这个问题,现在一切都运行良好。非常感谢。 -
@AlistairEvans 如果您将您的评论作为答案发表,那么我会将其标记为已接受。
-
总是简单的事情。 :)
标签: asp.net-core autofac aerospike