错误激活 int 没有匹配的绑定是 av

Error activating int No matching bindings are av

我正在尝试使用 Hangfire 运行 我的 MVC 项目中的后台作业。

我在控制器的构造函数中调用 Enqueue 方法:

public SHQSController(IUnitOfWork uow) : base(uow)
{
    BackgroundJob.Enqueue(() => _Uow.CostRepository.Merge());
}

_Uow.CostRepository属性returns一个接口:

public ICostRepository CostRepository
{
    get
    {
       return new CostRepository(_Context, _CurrentOrganisationID);
    }
}

但作业在 hangfire 中失败,原因如下:

Error activating int No matching bindings are av…

我发现如果我更改代码以便在实现 ICostRepository 时调用作业而不是通过接口调用作业,它会起作用:

即在我的控制器中:

BackgroundJob.Enqueue(() => _Uow.Test());

在我的工作单位:

public void Test()
{
    new CostRepository(_Context, _CurrentOrganisationID).Merge();
}

这是怎么回事?有没有一种方法可以让我将我的实现放在我的存储库而不是我的工作单元中?

编辑: 我在 HangFire.State table 中找到了完整的错误信息 完整的错误是:

Error activating int No matching bindings are available, and the type is not self-bindable. Activation path: 2) Injection of dependency int into parameter currentOrganisationID of constructor of type CostRepository 1) Request for CostRepository Suggestions: 1) Ensure that you have defined a binding for int. 2) If the binding was defined in a module, ensure that the module has been loaded into the kernel. 3) Ensure you have not accidentally created more than one kernel. 4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name. 5) If you are using automatic module loading, ensure the search path and filters are correct.

所以问题是 CostRepository 所依赖的 CurrentOrganisationIDCurrentOrganisationID 当前从 HttpContext 中检索并设置在工作单元上,工作单元将其传递给存储库的构造函数,如我上面的代码所示。

我认为这条线有问题:

BackgroundJob.Enqueue(() => _Uow.CostRepository.Merge());

是 Hangfire 将此解释为需要实例化 ICostRepository 和 运行 其 Merge 方法的实现,而不是实例化 IUow 和 运行 CostRepository.Merge() 在那。

我通过在控制器上创建一个 public 方法解决了这个问题:

public void Merge(int organisationid)
{
    _Uow.CostRepository.MergeSHQSCostsTable(organisationid);
}

并将其传递给 Enqueue 方法:

BackgroundJob.Enqueue(() => Merge(organisationid));

Hangfire 排队的作业现在是 SHQSController.Merge,依赖关系现在已正确解析。

顺便说一句,您可能会注意到我现在将 organisationid 作为参数传递给方法,而以前它在存储库中可用。这是从 HttpContext 检索到的,并且由于当控制器从后台作业实例化时它不可用,我不得不创建另一个从构造函数调用的私有方法,以便将 organisationid 连接到后台作业:

所以,而不是:

public SHQSController(IUnitOfWork uow) : base(uow)
{
    BackgroundJob.Enqueue(() => _Uow.CostRepository.Merge(CurrentOrganisationId));
}

我有:

public SHQSController(IUnitOfWork uow) : base(uow)
{
   EnqueueMerge(CurrentOrganisationID);
}

private void EnqueueMerge(int organisationid)
{
    BackgroundJob.Enqueue(() => Merge(organisationid));
}