c# – 有什么更好的方法在ASP.net核心上使用结构图的hangfire吗
发布时间:2020-12-15 06:26:58 所属栏目:百科 来源:网络整理
导读:我正在asp.net核心使用具有hangfire的结构图,应用程序没有错误,但是即使数据已经在数据库上,hangfire也不处理队列/调度任务. 这里是我的片段配置 public IServiceProvider ConfigureServices(IServiceCollection services) { // setup automapper var config
我正在asp.net核心使用具有hangfire的结构图,应用程序没有错误,但是即使数据已经在数据库上,hangfire也不处理队列/调度任务.
这里是我的片段配置 public IServiceProvider ConfigureServices(IServiceCollection services) { // setup automapper var config = new AutoMapper.MapperConfiguration(cfg => { cfg.AddProfile(new AutoMapperProfileConfiguration()); }); var mapper = config.CreateMapper(); services.AddSingleton(mapper); // Bind settings parameter services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.Configure<RouteOptions>(options => options.LowercaseUrls = true); services.AddDbContext<DefaultContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddHangfire(options => options.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection"))); services.AddMvc(); // ASP.NET use the StructureMap container to resolve its services. return ConfigureIoC(services); } public IServiceProvider ConfigureIoC(IServiceCollection services) { var container = new Container(); GlobalConfiguration.Configuration.UseStructureMapActivator(container); container.Configure(config => { // Register stuff in container,using the StructureMap APIs... config.Scan(_ => { _.AssemblyContainingType(typeof(Startup)); _.WithDefaultConventions(); _.AddAllTypesOf<IApplicationService>(); _.ConnectImplementationsToTypesClosing(typeof(IOptions<>)); }); config.For<JobStorage>().Use(new SqlServerStorage(Configuration.GetConnectionString("DefaultConnection"))); config.For<IJobFilterProvider>().Use(JobFilterProviders.Providers); config.For<ILog>().Use(c => LoggerFactory.LoggerFor(c.ParentType)).AlwaysUnique(); XmlDocument log4netConfig = new XmlDocument(); log4netConfig.Load(File.OpenRead("log4net.config")); var repo = LogManager.CreateRepository( Assembly.GetEntryAssembly(),typeof(log4net.Repository.Hierarchy.Hierarchy)); XmlConfigurator.Configure(repo,log4netConfig["log4net"]); //Populate the container using the service collection config.Populate(services); }); return container.GetInstance<IServiceProvider>(); } 有没有更好的方法使用hangfire和结构图在asp.net核心?我错过了什么,所以hangfire不能正常工作? 我的Hangfire结构图实现 using Hangfire; using StructureMap; namespace Lumochift.Helpers { /// <summary> /// Bootstrapper Configuration Extensions for StructureMap. /// </summary> public static class StructureMapBootstrapperConfigurationExtensions { /// <summary> /// Tells bootstrapper to use the specified StructureMap container as a global job activator. /// </summary> /// <param name="configuration">Bootstrapper Configuration</param> /// <param name="container">StructureMap container that will be used to activate jobs</param> public static void UseStructureMapActivator(this GlobalConfiguration configuration,IContainer container) { configuration.UseActivator(new StructureMapJobActivator(container)); } } } using Hangfire; using StructureMap; using System; namespace Lumochift.Helpers { public class StructureMapJobActivator : JobActivator { private readonly IContainer _container; /// <summary> /// Initializes a new instance of the <see cref="StructureMapJobActivator"/> /// class with a given StructureMap container /// </summary> /// <param name="container">Container that will be used to create instances of classes during /// the job activation process</param> public StructureMapJobActivator(IContainer container) { if (container == null) throw new ArgumentNullException(nameof(container)); _container = container; } /// <inheritdoc /> public override object ActivateJob(Type jobType) { return _container.GetInstance(jobType) } /// <inheritdoc /> public override JobActivatorScope BeginScope(JobActivatorContext context) { return new StructureMapDependencyScope(_container.GetNestedContainer()); } private class StructureMapDependencyScope : JobActivatorScope { private readonly IContainer _container; public StructureMapDependencyScope(IContainer container) { _container = container; } public override object Resolve(Type type) { return _container.GetInstance(type); } public override void DisposeScope() { _container.Dispose(); } } } } 示例hangfire呼叫控制器 BackgroundJob.Enqueue<CobaService>((cb) => cb.GetCoba()); BackgroundJob.Schedule<CobaService>((cb) => cb.GetCoba(),TimeSpan.FromSeconds(5) ); 截图: 解决方法
您应该使用
Hangfire.AspNetCore nuget软件包.
它使用AspNetCoreJobActivator作为默认的作业激活器,因此您不必创建自己的. AspNetCoreJobActivator使用IServiceScope.ServiceProvider.GetRequiredService(type)方法来解析依赖关系.从ConfigureServices返回的所有ServiceProvider与由structmap配置的所有服务相同. Implementation of (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |