Не определен беспараметрический конструктор Hangfire Ninject
У меня проблема с активацией экземпляра моего класса без определенного конструктора без параметров.
Конструктор:
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 ответ
Как метод _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 может не инициализироваться и фоновые задания не будут выполнены.