Autofac.Core.Registration.ComponentNotRegisteredException, FAILED: во время обработки фонового задания возникла исключительная ситуация - PullRequest
1 голос
/ 22 сентября 2019

Исключение: Запрошенный сервис 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)
}

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 Ответ

1 голос
/ 23 сентября 2019

К сожалению, здесь не так много работы - здесь нет никакого реального вопроса, нет объяснения того, какие шаги были предприняты для решения проблемы, какие вопросы уже рассматривались и т. Д.

Я рекомендую ознакомиться с этим сообщением о том, что делает хороший вопрос SO. Это может помочь вам - проработав некоторые вопросы и помогая побольше взглянуть на вопрос;и это может помочь другим - сузить то, на что нужно смотреть, или точно понять, за что ты стреляешь.Каждый выигрывает с хорошо написанным вопросом, даже люди, которые могут видеть подобную проблему и ищут помощи.

Учитывая, что есть некоторые догадки, чтобы выяснить, что вы спрашиваете, я предполагаю, что вопрос что-то вродестроки:

У меня [какое-то приложение ASP.NET, скорее всего, веб-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, если вы хотите поделиться синглтоном между веб-приложением и фоновой задачей.

В MyController.cs я не вижу, как разрешается TripManager.Я не знаю, является ли это статической ссылкой на TripManager.GetById(id) или это свойство.Там нет конструктора, поэтому вы не можете сказать, принимает ли он ITripManager или TripManager или что.

Однако проблемы с регистрацией там, скорее всего, дадут вам достаточно информации, чтобы начать устранение проблемы.В противном случае я мог бы рекомендовать открыть новый вопрос с более подробной информацией, чтобы люди могли лучше помочь вам.

...