3

Я установил пакет Hangfire.Ninject в приложение ASP MVC 5, чтобы выполнить некоторые фоновые задания.Hangfire with Ninject using InRequestScope

Я прочитал документацию, но я озадачен тем, как ее реализовать.

Моя существующая конфигурация использует InRequestScope для моего класса IUnitOfwork обеспечить только один экземпляр экземпляром для каждого запроса HTTP следующим образом:

private static void RegisterServices(IKernel kernel) 
{ 
     kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
} 

Чтобы использовать Ninject с замедленным воспламенением последовав документацию я обновил конфигурацию следующим образом в моем 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. 

У меня есть класс, я хотел бы использовать, чтобы обработать мою фоновую работу, используя замедленное воспламенение выглядит следующим образом:

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. 

Что это значит? Я все же хочу убедиться, что для каждого HTTP-запроса используется только один класс IUnitOfwork, который реализует dbContext. Как теперь это повлияет на остальную часть приложения, если я удалю InRequestScope?

ответ

0

Я думаю, проблема в том, что вы привязываете IUnitOfWork к себе. Для Niject потребуется конкретный класс, чтобы активировать что-то вроде UnitOfWork.

kernel.Bind<IUnitOfWork>() 
     .To<UnitOfWork() 
     .InNamedOrBackgroundJobScope(context => context.Kernel.Components.GetAll<INinjectHttpApplicationPlugin>() 
     .Select(c => c.GetRequestScope(context)) 
     .FirstOrDefault(s => s != null)); 
Смежные вопросы