C# 如何将dbcontext/工作单元发送到Hangfire作业筛选器
我们将Hangfire用于一些夜间和长时间运行的作业,并在单独的数据库中跟踪每个作业的其他相关详细信息/元数据,以避免将来出现Hangfire升级问题。 作业筛选器()可以帮助我们以更简单的方式跟踪每个作业的状态,但我找不到如何将依赖项发送到作业筛选器的示例 我们使用依赖注入(DI)和存储库+工作单元模式运行ASP.NETCore 如何从作业筛选器中访问数据库上下文(或工作单元,或通过DI提供的任何其他项) 多谢各位 编辑 我创建了一个存储库,其中包含一个小样本项目,概述了我在这里要做的工作: 它已编译,但行中有错误:C# 如何将dbcontext/工作单元发送到Hangfire作业筛选器,c#,asp.net-core,hangfire,C#,Asp.net Core,Hangfire,我们将Hangfire用于一些夜间和长时间运行的作业,并在单独的数据库中跟踪每个作业的其他相关详细信息/元数据,以避免将来出现Hangfire升级问题。 作业筛选器()可以帮助我们以更简单的方式跟踪每个作业的状态,但我找不到如何将依赖项发送到作业筛选器的示例 我们使用依赖注入(DI)和存储库+工作单元模式运行ASP.NETCore 如何从作业筛选器中访问数据库上下文(或工作单元,或通过DI提供的任何其他项) 多谢各位 编辑 我创建了一个存储库,其中包含一个小样本项目,概述了我在这里要做的工作:
.UseFilter(新的TypeFilterAttribute(typeof(LogToBattribute))从我的头顶,您可以尝试将JobFilter添加为,它将自动注入依赖项,如果您的
LogEverythingAttribute的构造函数中有依赖项,那么从您提供的链接修改示例:
public class EmailService
{
[TypeFilter(typeof(LogEverything))]
public static void Send() { }
}
GlobalJobFilters.Filters.Add(new TypeFilterAttribute(typeof(LogEverythingAttribute())));
免责声明:我自己还没有测试过上述内容,所以请告诉我是否有效
已编辑
在ConfigureServices
中尝试如下所示配置Hangfire,看看是否有效
services.AddHangfire(config =>
{
config.UseFilter(new TypeFilterAttribute(typeof(LogToDbAttribute)));
// if you are using the sqlserverstorage, uncomment the line and provie
// the required prameters
// config.UseSqlServerStorage(connectionString, sqlServerStorageOptions);
});
更新的答案
请看一下我对您提供的代码所做的修改。我已经测试过了,它正在工作。下面有几点需要注意
请查看我如何使用AddHttpClient方法注册HttpClient,该方法利用HttpClientFactory和类型化客户端。这是使用HttpClient的推荐方法。你可以阅读更多关于它的内容
我还注射了ILogger来证明它是有效的。出于某种原因,如果您尝试使用HttpClient执行任何操作,它将挂起。也许,原因是它是一个后台作业,所有HttpClient调用都是异步的,所以它不会返回,两个进程试图互相等待
如果您计划注入HttpClient,您可能需要研究它。但是,记录器工作正常
此外,您不需要从TypeFilterAttribute继承LogDbAttribute。TypeFilterAttribute解决方案没有像我最初建议的那样工作。在我的脑海中,您可以尝试将JobFilter添加为,它将自动注入依赖项,如果您的LogEverythingAttribute
的构造函数中有依赖项,那么从您提供的链接修改示例:
public class EmailService
{
[TypeFilter(typeof(LogEverything))]
public static void Send() { }
}
GlobalJobFilters.Filters.Add(new TypeFilterAttribute(typeof(LogEverythingAttribute())));
免责声明:我自己还没有测试过上述内容,所以请告诉我是否有效
已编辑
在ConfigureServices
中尝试如下所示配置Hangfire,看看是否有效
services.AddHangfire(config =>
{
config.UseFilter(new TypeFilterAttribute(typeof(LogToDbAttribute)));
// if you are using the sqlserverstorage, uncomment the line and provie
// the required prameters
// config.UseSqlServerStorage(connectionString, sqlServerStorageOptions);
});
更新的答案
请看一下我对您提供的代码所做的修改。我已经测试过了,它正在工作。下面有几点需要注意
请查看我如何使用AddHttpClient方法注册HttpClient,该方法利用HttpClientFactory和类型化客户端。这是使用HttpClient的推荐方法。你可以阅读更多关于它的内容
我还注射了ILogger来证明它是有效的。出于某种原因,如果您尝试使用HttpClient执行任何操作,它将挂起。也许,原因是它是一个后台作业,所有HttpClient调用都是异步的,所以它不会返回,两个进程试图互相等待
如果您计划注入HttpClient,您可能需要研究它。但是,记录器工作正常
此外,您不需要从TypeFilterAttribute继承LogDbAttribute。TypeFilterAttribute解决方案没有像我最初建议的那样工作。获取编译器错误。LogToDB属性类:公共类LogToDB:Microsoft.AspNetCore.Mvc.TypeFilterAttribute、IClientFilter、IServerFilter、IElectStateFilter、IApplyStateFilter{
错误在此构造函数行:公共LogToDB(IUnitOfWork unitOfWork){U unitOfWork=unitOfWork;}
错误:没有给出与“TypeFilterAttribute.TypeFilterAttribute(type)”的必需形式参数“type”相对应的参数。感谢您这么快的响应。噢,我想我在这里犯了一个错误。应该是新的TypeFilterAttribute(typeof(LogToDB))
。也不确定您是否使用GlobalConfiguration
类来配置HangFire和GlobalJobFilters
来添加过滤器,或者使用IserviceCollection
上的AddHangfire
扩展方法。请查看我编辑的答案,看看这是否有效。我得到了一个示例立即编译,但在尝试加载筛选器时出现运行时错误。我已使用此处的示例代码创建了一个存储库:好的,让我看看。我会就此与您联系。我想您可能需要实现自定义JobActivator。@ssvyper请查看更新后的答案。我已经测试了它,它正在工作。我希望这有助于设置编译器错误。LogToDB属性类:公共类LogToDB:Microsoft.AspNetCore.Mvc.TypeFilterAttribute、IClientFilter、IServerFilter、IElectStateFilter、IApplyStateFilter{
错误位于此构造函数行:公共LogToDB(IUUnitOfWork unitOfWork){U unitOfWork=unitOfWork;}
错误:没有给出与“TypeFilterAttribute.TypeFilterAttribute(type)”的必需形式参数“type”相对应的参数。感谢您这么快的响应。噢,我想我在这里犯了一个错误。应该是新的TypeFilterAttribute(typeof(LogToDB))
。也不确定您是否使用全局配置
类来配置HangFire,使用全局作业过滤器
来添加过滤器,或者使用IServ上的添加HangFire
扩展方法