我正在尝试使用 Hangfire 在我的 MVC 项目中运行后台作业。
Enqueue
我在控制器的构造函数中调用该方法:
public SHQSController(IUnitOfWork uow) : base(uow)
{
BackgroundJob.Enqueue(() => _Uow.CostRepository.Merge());
}
该_Uow.CostRepository
属性返回一个接口:
public ICostRepository CostRepository
{
get
{
return new CostRepository(_Context, _CurrentOrganisationID);
}
}
但是由于以下原因,该作业在hangfire中失败:
错误激活 int 没有匹配的绑定是 av...</p>
我发现如果我更改代码以便在实现ICostRepository
而不是通过接口调用作业,它可以工作:
即在我的控制器中:
BackgroundJob.Enqueue(() => _Uow.Test());
在我的工作单元中:
public void Test()
{
new CostRepository(_Context, _CurrentOrganisationID).Merge();
}
这里发生了什么?有没有办法让我将我的实现放在我的存储库而不是我的工作单元中?
编辑:我在 HangFire.State 表中找到了完整的错误消息完整的错误是:
激活 int 时出错 没有匹配的绑定可用,并且类型不是自绑定的。激活路径: 2) 将依赖 int 注入到 CostRepository 类型的构造函数的参数 currentOrganisationID 1) 请求 CostRepository 建议: 1) 确保您已为 int 定义绑定。2) 如果绑定是在模块中定义的,请确保该模块已加载到内核中。3) 确保您没有意外创建多个内核。4) 如果您使用构造函数参数,请确保参数名称与构造函数参数名称匹配。5) 如果您使用自动模块加载,请确保搜索路径和过滤器正确。
所以问题是CurrentOrganisationID
依赖CostRepository
的。当前CurrentOrganisationID
是从工作单元上的和设置中检索的HttpContext
,它会将其传递给存储库的构造函数,如我上面的代码所示。