gpt4 book ai didi

c# - 没有为此对象定义无参数构造函数 - Hangfire 调度程序

转载 作者:太空狗 更新时间:2023-10-29 23:06:45 26 4
gpt4 key购买 nike

我刚刚在我的 MVC 网站上安装了 Hangfire 包。我创建了一个 Startup 类

[assembly: OwinStartup(typeof(Website.Startup))]

namespace Website
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
Hangfire.ConfigureHangfire(app);
Hangfire.InitializeJobs();
}
}
}

和一个 Hangfire 类

public class Hangfire
{
public static void ConfigureHangfire(IAppBuilder app)
{
app.UseHangfire(config =>
{
config.UseSqlServerStorage("DefaultConnection");
config.UseServer();
config.UseAuthorizationFilters();
});
}

public static void InitializeJobs()
{
RecurringJob.AddOrUpdate<CurrencyRatesJob>(j => j.Execute(), "* * * * *");
}
}

此外,我在单独的类库中创建了一个新作业

public class CurrencyRatesJob
{
private readonly IBudgetsRepository budgetsRepository;

public CurrencyRatesJob(IBudgetsRepository budgetsRepository)
{
this.budgetsRepository = budgetsRepository;
}

public void Execute()
{
try
{
var budgets = new BudgetsDTO();
var user = new UserDTO();

budgets.Sum = 1;
budgets.Name = "Hangfire";
user.Email = "email@g.com";

budgetsRepository.InsertBudget(budgets, user);
}
catch (Exception ex)
{
var message = ex.ToString();
throw new NotImplementedException(message);
}
}
}

因此,当我运行该应用程序时,在 Hangfire 的仪表板中出现以下错误:

Failed An exception occurred during job activation.
System.MissingMethodException

No parameterless constructor defined for this object.

System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at Hangfire.JobActivator.ActivateJob(Type jobType)
at Hangfire.Common.Job.Activate(JobActivator activator)

所以,我在这里有点迷路了。我错过了什么?

最佳答案

看来您尚未将 Hangfire 连接到您正在使用的 IoC 容器,因此它使用其默认策略来创建请求的类型,在您的特定示例中这意味着调用:

System.Activator.CreateInstance(typeof(CurrencyRatesJob));

因为 CurrencyRatesJob 类没有默认的无参数构造函数,所以这会失败并显示您在问题中显示的错误消息。

要将 Hangfire 连接到你的 IoC 基础设施,你需要创建你自己的 JobActivator 类来覆盖 ActivateJob 方法并使用配置的 IoC 容器来创建请求的实例工作类型。

可以找到使用 Unity 作为容器的示例 (UnityJobActivator) here可以找到 Funq 容器 (FunqJobActivator) 的示例 here .

该过程在 Hangfire documentation 中进行了描述,以及多种容器类型的标准实现可从 Hangfire github repo 获得。

关于c# - 没有为此对象定义无参数构造函数 - Hangfire 调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30036242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com