1

例外: 请求的服务“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)

启动.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)
}

我的控制器.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));
   }
4

1 回答 1

1

不幸的是,这里没有什么可继续的——没有实际的问题,没有解释为解决问题采取了哪些步骤,已经研究了哪些问题等等。

我建议查看这篇文章,了解什么是一个好的 SO 问题。这可以帮助你——通过解决一些问题并帮助更多地关注这个问题;它可以帮助其他人 - 通过缩小需要查看的内容或准确了解您的目标。每个人都以写得很好的问题获胜,即使是那些可能看到类似问题并正在寻求帮助的人。

鉴于有一些猜测可以弄清楚你在问什么,我认为这个问题是这样的:

我有 [某种 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且后台任务没有请求。那是行不通的。您必须在每个后台任务中注册,InstancePerDependency或者InstancePerLifetimeScope如果您想要一个新的;或者SingleInstance,如果您想在 Web 应用程序和后台任务之间共享一个单例。

MyController.cs我看不出TripManager是如何解决的。我不知道这是静态引用TripManager.GetById(id)还是属性。没有构造函数,因此您无法判断它是采用 aITripManager还是 aTripManager还是什么。

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

于 2019-09-23T15:34:21.077 回答