例外: 所请求的服务“ 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));
}
答案 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
,并且后台任务没有请求。那是行不通的。如果您想在每个后台任务中重新使用一个,则必须注册为InstancePerDependency
或InstancePerLifetimeScope
。或SingleInstance
(如果要在Web应用程序和后台任务之间共享单例)。在MyController.cs
中,我看不到TripManager
的解析方式。我不知道这是对TripManager.GetById(id)
的静态引用还是那是一个属性。没有构造函数,因此您无法确定它是在使用ITripManager
还是TripManager
还是什么。
但是,那里的注册问题可能应该为您提供足够的信息以开始解决该问题。如果没有,我建议您打开一个更多细节的新问题,以便人们可以更好地为您提供帮助。