Hangfire с Ninject с использованием InRequestScope
Я установил пакет Hangfire.Ninject в приложение ASP MVC 5, чтобы я мог запускать некоторые фоновые задания.
Я прочитал документацию, но я озадачен тем, как ее реализовать.
Моя существующая конфигурация использует InRequestScope для моего класса IUnitOfwork, чтобы гарантировать создание только одного экземпляра для каждого HTTP-запроса следующим образом:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
}
Чтобы использовать ninject с hangfire, следуя документации, я обновил конфигурацию следующим образом в моем классе ninjectwebcommon.cs:
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
GlobalConfiguration.Configuration.UseNinjectActivator(kernel);
RegisterServices(kernel);
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>()
.ToSelf()
.InNamedOrBackgroundJobScope(context => context.Kernel.Components.GetAll<INinjectHttpApplicationPlugin>()
.Select(c => c.GetRequestScope(context))
.FirstOrDefault(s => s != null));
}
Но теперь я получаю следующую ошибку:
Error activating IUnitOfWork using self-binding of IUnitOfWork
No constructor was available to create an instance of the implementation type.
У меня есть класс, который я хотел бы использовать для обработки моей фоновой работы с использованием Hangfire:
public class EmailJob
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMailer _mailer;
public EmailJob(IUnitOfWork unitOfWork, IMailer mailer)
{
_unitOfWork = unitOfWork;
_notificationMailer = notificationMailer;
}
public void Execute()
{
// DO Stuff
}
}
Кто-нибудь знает, что я делаю не так? В документации также говорится:
Services registered with InRequestScope() directive will be unavailable during job activation, you should re-register these services without this hint.
Что это значит? Я все еще хочу гарантировать, что только один класс IUnitOfwork, который реализует dbContext, используется для запроса http. Как это теперь повлияет на остальную часть приложения, если я удалю InRequestScope?
1 ответ
Я думаю, проблема в том, что вы привязываете IUnitOfWork к себе. Niject потребуется конкретный класс для активации чего-то вроде UnitOfWork.
kernel.Bind<IUnitOfWork>()
.To<UnitOfWork()
.InNamedOrBackgroundJobScope(context => context.Kernel.Components.GetAll<INinjectHttpApplicationPlugin>()
.Select(c => c.GetRequestScope(context))
.FirstOrDefault(s => s != null));