【问题标题】:Error activating int No matching bindings are av错误激活 int 没有匹配的绑定是 av
【发布时间】: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 所依赖的CurrentOrganisationIDCurrentOrganisationID 当前是从 HttpContext 检索并设置在工作单元上,然后将其传递给存储库的构造函数,如我上面的代码所示。

【问题讨论】:

  • 这是一个 NInject 错误,不是吗?您能否显示整个错误消息,因为它应该包含一些额外的信息?
  • @stuartd 这是一个 Ninject 错误。我认为这是因为 CostRepository 在构造函数中采用了一个整数,而 Hangfire 试图注入存储库而不是使用我的显式调用。恐怕我不知道如何从hangfire 中获取全部信息
  • @stuartd 找到完整的错误消息。这证实了我的猜想。查看我的编辑

标签: c# asp.net-mvc hangfire hangfire.ninject


【解决方案1】:

我认为这行的问题:

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

Hangfire 是否将此解释为实例化ICostRepository 的实现并运行其Merge 方法的要求,而不是实例化IUow 的实现并在其上运行CostRepository.Merge()

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

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));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多