【问题标题】:Autofac DependencyResolutionExceptionAutofac DependencyResolutionException
【发布时间】: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


【解决方案1】:

检查从_configuration["AerospikeHostName"] 返回的实际类型。它实际上是string,还是恰好可以分配给字符串的东西?

同样,检查使用的实际值是否有效,因为 Autofac 应该可以期待该字符串值。

另外,将来,考虑使用内置的diagnostics 来更清楚地了解在解析操作期间引发了哪些异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2021-07-02
    • 2012-04-22
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多