Autofac.Core.Registration.ComponentNotRegisteredException,失败:后台作业处理期间发生异常

时间:2019-09-22 05:52:43

标签: c# asp.net dependency-injection autofac hangfire-autofac

例外: 所请求的服务“ Mach.CharterPad.Business.TripManager”尚未注册。为避免此异常,请注册一个组件以提供服务,或者使用IsRegistered()检查服务注册,或者使用ResolveOptional()方法解决可选的依赖项。

Autofac.Core.Registration.ComponentNotRegisteredException:所请求的服务“ Mach.CharterPad.Business.TripManager”尚未注册。为避免此异常,请注册一个组件以提供服务,或者使用IsRegistered()检查服务注册,或者使用ResolveOptional()方法解决可选的依赖项。

at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
   at Hangfire.AutofacJobActivator.AutofacScope.Resolve(Type type)
   at Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext context)
   at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass9_0.<PerformJobWithFilters>b__0()
   at Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter filter, PerformingContext preContext, Func`1 continuation)
   at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext context, IEnumerable`1 filters)
   at Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext context)
   at Hangfire.Server.Worker.PerformJob(BackgroundProcessContext context, IStorageConnection connection, String jobId)

Startup.cs

private void ConfigureAutofac(HttpConfiguration config, IAppBuilder app)
{
  var builder = new ContainerBuilder();
  var businessasm = BuildManager.GetReferencedAssemblies()
                                .Cast<Assembly>()
                                .Where(n => n.FullName.Contains("Business"))
                                .FirstOrDefault();

  builder.RegisterAssemblyTypes(businessasm)
  .Where(t => t.Name.EndsWith("Manager"))
  .AsImplementedInterfaces()
  .InstancePerRequest();

//Set the dependency resolver to be Autofac.
   var container = builder.Build();
   config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
   Hangfire.GlobalConfiguration.Configuration.UseAutofacActivator(container, 
   false);
   config.MessageHandlers.Insert(0, new ApiDelegatingHandler());
   app.UseAutofacMiddleware(container);
   app.UseAutofacWebApi(config)
}

MyController.cs

[Route("{Id}")]
public IHttpActionResult GetById(long Id)
   {
     var result = TripManager.GetById(Id);  // WORKS PERFECT

     var jobId = BackgroundJob.Enqueue(() => TripManager.GetById(Id)); // Always go to Retries in Hangfire

     return Ok(result != null ? new ApiResponse(true, "Trip has been found", result) : new ApiResponse(false, "No record found", result));
   }

1 个答案:

答案 0 :(得分:1)

不幸的是,这里没有太多可做的事情-没有实际的问题,也没有解释为解决问题采取了哪些步骤,已经考虑了哪些问题,等等。

I recommend checking out this post on what makes a good SO question. :这可以帮助您-通过解决一些问题并帮助更多地关注该问题;并且可以帮助其他人-通过缩小需要看的内容或确切了解您要拍摄的内容。每个人都将赢得一个写得很好的问题,即使是可能看到类似问题并正在寻求帮助的人。

鉴于有一些猜测可以弄清楚您要问什么,我认为这个问题与以下内容类似:

  

我有[某种ASP.NET应用程序,可能是Web API]运行OWIN管道。我也有通过Hangfire运行的后台作业。我正在尝试在ASP.NET应用程序和Hangfire作业之间共享一个容器,但我看到了一个异常[在某些时候,但尚不清楚何时]。为什么会发生这种异常?

首先,异常消息告诉您很多信息:

  

请求的服务“ Mach.CharterPad.Business.TripManager”尚未注册。

查看您的注册情况...

builder.RegisterAssemblyTypes(businessasm)
  .Where(t => t.Name.EndsWith("Manager"))
  .AsImplementedInterfaces()
  .InstancePerRequest();

我马上看到了两个潜在的问题:

  • 您使用过AsImplementedInterfaces,这意味着如果您拥有public class TripManager : ITripManager,那么它将注册为ITripManager。如果仅注册接口,则无法解析具体类型。您还必须注册事物AsSelf
  • 您已指定InstancePerRequest,并且后台任务没有请求。那是行不通的。如果您想在每个后台任务中重新使用一个,则必须注册为InstancePerDependencyInstancePerLifetimeScope。或SingleInstance(如果要在Web应用程序和后台任务之间共享单例)。

MyController.cs中,我看不到TripManager的解析方式。我不知道这是对TripManager.GetById(id)的静态引用还是那是一个属性。没有构造函数,因此您无法确定它是在使用ITripManager还是TripManager还是什么。

但是,那里的注册问题可能应该为您提供足够的信息以开始解决该问题。如果没有,我建议您打开一个更多细节的新问题,以便人们可以更好地为您提供帮助。

相关问题