首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用InRequestScope使用Ninject的Hangfire

使用InRequestScope使用Ninject的Hangfire
EN

Stack Overflow用户
提问于 2016-08-08 01:34:06
回答 1查看 726关注 0票数 4

我已经将Hangfire.Ninject包安装到一个ASPMVC5应用程序中,这样我就可以运行一些后台作业。

我已经通读了文档,但我对如何实现它感到困惑。

我的现有配置为我的IUnitOfwork类使用了InRequestScope,以确保每个IUnitOfwork请求只实例化一个实例,如下所示:

代码语言:javascript
复制
private static void RegisterServices(IKernel kernel)
{
        kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
 } 

为了在hangfire中使用ninject,遵循文档,我在我的ninjectwebcommon.cs类中更新了配置,如下所示:

代码语言:javascript
复制
 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));

    }

但现在我得到了以下错误:

代码语言:javascript
复制
Error activating IUnitOfWork using self-binding of IUnitOfWork
No constructor was available to create an instance of the implementation type.

我有一个使用hangfire处理后台工作的类,如下所示:

代码语言:javascript
复制
 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
    }

}

有人知道我做错了什么吗?文档还说明:

代码语言:javascript
复制
Services registered with InRequestScope() directive will be unavailable during job activation, you should re-register these services without this hint.

这是什么意思?我仍然希望确保每个http请求只使用一个实现dbContext的IUnitOfwork类。如果我删除InRequestScope,这将如何影响应用程序的其余部分?

EN

回答 1

Stack Overflow用户

发布于 2016-09-14 16:14:27

我认为问题在于你正在将IUnitOfWork绑定到它自己。对象需要一个具体的类来激活像UnitOfWork这样的东西。

代码语言:javascript
复制
  kernel.Bind<IUnitOfWork>()
        .To<UnitOfWork()
        .InNamedOrBackgroundJobScope(context => context.Kernel.Components.GetAll<INinjectHttpApplicationPlugin>()
        .Select(c => c.GetRequestScope(context))
        .FirstOrDefault(s => s != null));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38816781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档