Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Microsoft.Extensions.DependencyInjection中使用Asp.Net 4.7和DI设置Hangfire?_C#_Asp.net Mvc_Dependency Injection_Hangfire - Fatal编程技术网

C# 如何在Microsoft.Extensions.DependencyInjection中使用Asp.Net 4.7和DI设置Hangfire?

C# 如何在Microsoft.Extensions.DependencyInjection中使用Asp.Net 4.7和DI设置Hangfire?,c#,asp.net-mvc,dependency-injection,hangfire,C#,Asp.net Mvc,Dependency Injection,Hangfire,我正在尝试在Asp.Net 4.7.2 MVC应用程序中使用带有Microsoft.Extensions.DependencyInjection的Hangfire。 我有DI的设置和工作,我只是不能正确配置Hangfire。下面的当前实现运行仪表板,但执行后台任务会返回错误: JobActivator返回了“Dh.Web.Services.EmailService”类型的空实例 我知道EmailService在DI中设置正确,因为我可以在调用BackgroundJob.Enqueue方法的同一控

我正在尝试在Asp.Net 4.7.2 MVC应用程序中使用带有Microsoft.Extensions.DependencyInjection的Hangfire。 我有DI的设置和工作,我只是不能正确配置Hangfire。下面的当前实现运行仪表板,但执行后台任务会返回错误: JobActivator返回了“Dh.Web.Services.EmailService”类型的空实例

我知道EmailService在DI中设置正确,因为我可以在调用BackgroundJob.Enqueue方法的同一控制器中使用DI访问它

我的实施是:

HangfireActivator.cs

    public class HangfireActivator : JobActivator
    {
        private readonly IServiceProvider _serviceProvider;

        public HangfireActivator(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public override object ActivateJob(Type type)
        {
            return _serviceProvider.GetService(type);
        }
    } 
        private void ConfigureHangfire(IServiceProvider serviceProvider, IAppBuilder app)
        {
            var hangfireConnString = ConfigurationManager.ConnectionStrings["Dh"].ConnectionString;

            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseActivator(new HangfireActivator(serviceProvider))
                .UseSqlServerStorage(hangfireConnString, new SqlServerStorageOptions
                    {
                        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                        QueuePollInterval = TimeSpan.FromSeconds(10),
                        UseRecommendedIsolationLevel = true,
                        UsePageLocksOnDequeue = true,
                        DisableGlobalLocks = true,
                    }
                );

            app.UseHangfireServer(new BackgroundJobServerOptions {WorkerCount = 3});

            var options = new DashboardOptions()
            {
                Authorization = new[] {new SystemAuthorizationFilter()}
            };
            app.UseHangfireDashboard("/hangfire",options);
        }
        public void Configuration(IAppBuilder app)
        {
            var services = new ServiceCollection();

            //App DI 
            ConfigureServices(services);

            var serviceProvider = services.BuildServiceProvider();
            var resolver = new DefaultDependencyResolver(serviceProvider);
            DependencyResolver.SetResolver(resolver);

            //Hangfire
            ConfigureHangfire(serviceProvider,app);
        }
在startup.cs内部配置hangfire方法

    public class HangfireActivator : JobActivator
    {
        private readonly IServiceProvider _serviceProvider;

        public HangfireActivator(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public override object ActivateJob(Type type)
        {
            return _serviceProvider.GetService(type);
        }
    } 
        private void ConfigureHangfire(IServiceProvider serviceProvider, IAppBuilder app)
        {
            var hangfireConnString = ConfigurationManager.ConnectionStrings["Dh"].ConnectionString;

            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseActivator(new HangfireActivator(serviceProvider))
                .UseSqlServerStorage(hangfireConnString, new SqlServerStorageOptions
                    {
                        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                        QueuePollInterval = TimeSpan.FromSeconds(10),
                        UseRecommendedIsolationLevel = true,
                        UsePageLocksOnDequeue = true,
                        DisableGlobalLocks = true,
                    }
                );

            app.UseHangfireServer(new BackgroundJobServerOptions {WorkerCount = 3});

            var options = new DashboardOptions()
            {
                Authorization = new[] {new SystemAuthorizationFilter()}
            };
            app.UseHangfireDashboard("/hangfire",options);
        }
        public void Configuration(IAppBuilder app)
        {
            var services = new ServiceCollection();

            //App DI 
            ConfigureServices(services);

            var serviceProvider = services.BuildServiceProvider();
            var resolver = new DefaultDependencyResolver(serviceProvider);
            DependencyResolver.SetResolver(resolver);

            //Hangfire
            ConfigureHangfire(serviceProvider,app);
        }
最后是Startup.cs中的配置方法

    public class HangfireActivator : JobActivator
    {
        private readonly IServiceProvider _serviceProvider;

        public HangfireActivator(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public override object ActivateJob(Type type)
        {
            return _serviceProvider.GetService(type);
        }
    } 
        private void ConfigureHangfire(IServiceProvider serviceProvider, IAppBuilder app)
        {
            var hangfireConnString = ConfigurationManager.ConnectionStrings["Dh"].ConnectionString;

            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseActivator(new HangfireActivator(serviceProvider))
                .UseSqlServerStorage(hangfireConnString, new SqlServerStorageOptions
                    {
                        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                        QueuePollInterval = TimeSpan.FromSeconds(10),
                        UseRecommendedIsolationLevel = true,
                        UsePageLocksOnDequeue = true,
                        DisableGlobalLocks = true,
                    }
                );

            app.UseHangfireServer(new BackgroundJobServerOptions {WorkerCount = 3});

            var options = new DashboardOptions()
            {
                Authorization = new[] {new SystemAuthorizationFilter()}
            };
            app.UseHangfireDashboard("/hangfire",options);
        }
        public void Configuration(IAppBuilder app)
        {
            var services = new ServiceCollection();

            //App DI 
            ConfigureServices(services);

            var serviceProvider = services.BuildServiceProvider();
            var resolver = new DefaultDependencyResolver(serviceProvider);
            DependencyResolver.SetResolver(resolver);

            //Hangfire
            ConfigureHangfire(serviceProvider,app);
        }
我怀疑这是一行:
var serviceProvider=services.BuildServiceProvider()这是创建一个独立的服务提供商,我在其中设置了所有应用程序DI,但如果没有该行,我不知道如何将服务提供商设置为Hangfire中的UseActivator选项

我真的非常感谢任何意见。谢谢大家!

我已在我的DI中注册:
services.AddTransient()

但是,在没有接口的情况下,添加这个来注册具体类是可行的。
services.AddTransient()

我已在DI中注册:
services.AddTransient()

但是,在没有接口的情况下,添加这个来注册具体类是可行的。
services.AddTransient()