【发布时间】:2018-04-24 10:51:17
【问题描述】:
我正在尝试使用 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);
}
}
但由于以下原因,作业在挂火中失败:
错误激活 int 没有匹配的绑定是 av...
我发现如果我更改代码以便在ICostRepository 的实现上调用作业而不是通过接口,它可以工作:
即在我的控制器中:
BackgroundJob.Enqueue(() => _Uow.Test());
在我的工作单元中:
public void Test()
{
new CostRepository(_Context, _CurrentOrganisationID).Merge();
}
这里发生了什么?有没有一种方法可以让我将我的实现放入我的存储库而不是我的工作单元中?
编辑:我在 HangFire.State 表中找到了完整的错误消息完整的错误是:
错误激活 int 没有匹配的绑定可用,类型 不是自绑定的。激活路径:2)依赖注入 int 类型的构造函数的参数 currentOrganisationID CostRepository 1) 请求 CostRepository 建议:1) 确保您已经为 int 定义了一个绑定。 2)如果绑定 在模块中定义,确保模块已加载到 内核。 3) 确保您没有意外创建超过 一个内核。 4) 如果您使用构造函数参数,请确保 参数名称与构造函数参数名称匹配。 5) 如果 您正在使用自动模块加载,确保搜索路径和 过滤器是正确的。
所以问题在于CostRepository 所依赖的CurrentOrganisationID。 CurrentOrganisationID 当前是从 HttpContext 检索并设置在工作单元上,然后将其传递给存储库的构造函数,如我上面的代码所示。
【问题讨论】:
-
这是一个 NInject 错误,不是吗?您能否显示整个错误消息,因为它应该包含一些额外的信息?
-
@stuartd 这是一个 Ninject 错误。我认为这是因为 CostRepository 在构造函数中采用了一个整数,而 Hangfire 试图注入存储库而不是使用我的显式调用。恐怕我不知道如何从hangfire 中获取全部信息
-
@stuartd 找到完整的错误消息。这证实了我的猜想。查看我的编辑
标签: c# asp.net-mvc hangfire hangfire.ninject