Не определен беспараметрический конструктор Hangfire Ninject - PullRequest
0 голосов
/ 21 ноября 2018

У меня проблема с активацией экземпляра моего класса без определенного конструктора без параметров.

Конструктор:

public HangfireExecutor(ICommandDispatcher commandDispatcher, IQueryDispatcher queryDispatcher, IMapper mapper)

Как мне зарегистрироваться и настроить Hangfire (вместо этого используются три точки)конфиденциальной информации):

[assembly: OwinStartupAttribute(typeof(Web2.Startup))]
    public partial class Startup

    private IAppBuilder _app;
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        _app = app;

        GlobalConfiguration.Configuration.UseSqlServerStorage("...");

        _app.UseHangfireDashboard("/...", new DashboardOptions
        {
            Authorization = new[] { new HangfireDashboardAuthorizationFilter() },
            AppPath = "/Identity/Create"
        });

        _app.UseHangfireServer();

        _app.UseNinjectMiddleware(CreateKernel);
    }

Регистрация в контейнере IoC:

public partial class Startup
{
...
protected IKernel CreateKernel()
{
    var kernel = new StandardKernel();
    ...
    kernel.Bind<HangfireExecutor>().ToSelf().InBackgroundJobScope();
    GlobalConfiguration.Configuration.UseNinjectActivator(kernel);
    return kernel;

Ошибка:

System.MissingMethodException
No parameterless constructor defined for this object hangfire ninject System.RuntimeTypeHandle.CreateInstance
System.MissingMethodException: No parameterless constructor defined for this object
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at Hangfire.JobActivator.ActivateJob(Type jobType)
at Hangfire.JobActivator.SimpleJobActivatorScope.Resolve(Type type)
at Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext context)

Для меня похоже, что Hangfire не используетАктиватор Ninject (?), Но я не знаю почему.

Я следовал обоим учебным пособиям: на сайте Hangfire и Hangfire.Ninject github, а также в нескольких репозиториях на github и SO.

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

Я использую:

  • ASP .NET MVC 5
  • .NET Framework 4.6.1,
  • Hangfire 1.6.21
  • Hangfire.Ninject 1.2

1 Ответ

0 голосов
/ 22 ноября 2018

Поскольку метод _app.UseNinjectMiddleware(CreateKernel); не создает ядро ​​(просто сохраняет делегат методу, создающему ядро), правильный порядок команд в конфигурации Hangfire в моем случае должен быть:

public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        _app = app;

        GlobalConfiguration.Configuration.UseSqlServerStorage("...");

        _app.UseHangfireDashboard("/...", new DashboardOptions
        {
            Authorization = new[] { new HangfireDashboardAuthorizationFilter() },
            AppPath = "/Identity/Create"
        });

        _app.UseNinjectMiddleware(CreateKernel);
    }

, а затем наконец метода CreateKernel:

kernel.Bind<HangfireExecutor>().ToSelf().InBackgroundJobScope();

        GlobalConfiguration.Configuration.UseNinjectActivator(kernel);

        _app.UseHangfireServer();

        return kernel;

Теперь Hangfire начал разрешать зависимости.Я думаю, что важно создать ядро ​​как можно скорее после запуска приложения, иначе Hangfire может не инициализироваться и фоновые задания не будут выполнены.

...