Как настроить hangfire в ядре asp.net с использованием структуры структуры, нацеленной на .net framework, и разрешить двунаправленную зависимость - PullRequest
1 голос
/ 18 апреля 2019

Я только что ударился головой о стену, не зная, что происходит.

У меня есть основной веб-проект asp.net, нацеленный на .NET 4.7.2, который я использую.пытался настроить Hangfire.

public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            var connectionString = Configuration.GetConnectionString("DocumentDbConnection");

            services.AddMvc(o =>
                {
                    o.Filters.Add(typeof(HttpGlobalExceptionFilter));

                })
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);


            services
                .AddHangfire(x => x.UseSqlServerStorage(connectionString));


            // configure StructureMap Dependency Injection
            var container = new Container();
            container.Configure(config =>
            {
                config.Scan(scan =>
                {
                    scan.TheCallingAssembly();
                    scan.AssembliesAndExecutablesFromApplicationBaseDirectory();
                    scan.WithDefaultConventions();
                    scan.AddAllTypesOf(typeof(IIntegrationEventHandler<>));
                });
// other configurations
                config.Populate(services);
            });

            // tried this too
//GlobalConfiguration.Configuration.UseStructureMapActivator(container);

            return container.GetInstance<IServiceProvider>();
        }

и мой метод настройки:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IContainer container)
        {
            //using Hangfire.StructureMap
GlobalConfiguration.Configuration.UseStructureMapActivator(container);

// exception is thrown on UsingHangfireServer()
            app
                .UseHangfireServer()
                .UseMvc();
        }

Я получаю исключение из StructureMap о двунаправленной зависимости:

Bi-directional dependency relationship detected!
Check the StructureMap stacktrace below:
1.) Instance of Hangfire.Client.IBackgroundJobFactory ('Hangfire.Client.BackgroundJobFactory, Hangfire.Core, Version=1.7.0.0, Culture=neutral, PublicKeyToken=null')
2.) new BackgroundJobFactory(*Default of IJobFilterProvider*, *Default of IBackgroundJobFactory*)
3.) Hangfire.Client.BackgroundJobFactory ('Hangfire.Client.BackgroundJobFactory, Hangfire.Core, Version=1.7.0.0, Culture=neutral, PublicKeyToken=null')
4.) Instance of Hangfire.Client.IBackgroundJobFactory ('Hangfire.Client.BackgroundJobFactory, Hangfire.Core, Version=1.7.0.0, Culture=neutral, PublicKeyToken=null')
5.) Container.GetInstance(Hangfire.Client.IBackgroundJobFactory)
6.) Container.TryGetInstance(Hangfire.Client.IBackgroundJobFactory)

Я используюпакеты Hangfire.AspNetCore, Hangfire.SqlServer, Hangfire.StructureMap, все версии 1.7.0

Я также пытался просто использовать пакет Hangfire, но не могу настроить его в своем классе запуска, поскольку ни один из методов расширения не был доступен.

Также обратите внимание, что эта точная настройка прекрасно работает в проекте, ориентированном на ядро ​​.net.

Буду признателен за любой совет!

1 Ответ

1 голос
/ 18 апреля 2019

Оказывается, это была проблема с этой строкой в ​​конфигурации структуры карты:

scan.AssembliesAndExecutablesFromApplicationBaseDirectory();

Я должен был использовать что-то вроде этого:

scan.AssemblyContainingType<IThumbnailGenerator>(); // directing structuremap to scan the assembly containing this type
...