首页 > 解决方案 > 使用 HangFire 启动实现接口的作业时如何使用自定义作业名称

问题描述

我正在尝试使用 HangFire 来安排任何实现我调用的某个接口的类IScheduledService。这些服务按预期运行,但 HangFire UI 始终为 HangFire 仪表板中的每个服务显示相同的名称PerformService()。我知道这是设计使然,因为我将相同的函数名称传递给每个作业,但用户并不真正知道正在运行什么特定作业。

我创建了接口,ServiceName因为我认为可以将其传递给 HangFire 以覆盖可见的作业名称而不是被调用的函数的名称,但看不到修改作业名称的能力。有没有办法提供自定义作业名称,以便 HangFire UI 将根据ServiceName属性值显示每个作业的标题?

public interface IScheduledService
{
    string ServiceId { get; }
    string ServiceName { get; }
    void PerformService();
}

public class Service1 : IScheduledService
{
    public string ServiceId { get => "e56643b1-f0cf-44b2-81ef-bf7a085de760"; }
    public string ServiceName { get => this.GetType().Name; }

    public void PerformService()
    {
        Console.WriteLine($"Hello world from {ServiceName}");
    }
}

标签: c#.net-corehangfire

解决方案


尝试使用 JobDisplayNameAttribute。

我在代码中看到了几个可能被渲染的地方......

在 RecurringJobsPage 和 JobDetailsPage 你可以看到它调用 HtmlHelper.JobName

HtmlHelper 有一些寻找 JobDisplayNameAttribute 的代码

https://github.com/HangfireIO/Hangfire/blob/a07ad0b9926923db75747d92796c5a9db39c1a87/src/Hangfire.Core/Dashboard/HtmlHelper.cs

您可以在 1.7.0 版已关闭的问题中看到对它的引用。如果你在那个版本上。

https://github.com/HangfireIO/Hangfire/issues/1136

在旧问题中也有一些关于在方法上使用 DisplayNameAttribute 的参考。

尝试像这样使用 JobDisplayName 或 DisplayName 装饰方法

[JobDisplayName("RunJobNumberOne")]
public void RunSomeJob(string arg){


推荐阅读