Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将dbcontext/工作单元发送到Hangfire作业筛选器_C#_Asp.net Core_Hangfire - Fatal编程技术网

C# 如何将dbcontext/工作单元发送到Hangfire作业筛选器

C# 如何将dbcontext/工作单元发送到Hangfire作业筛选器,c#,asp.net-core,hangfire,C#,Asp.net Core,Hangfire,我们将Hangfire用于一些夜间和长时间运行的作业,并在单独的数据库中跟踪每个作业的其他相关详细信息/元数据,以避免将来出现Hangfire升级问题。 作业筛选器()可以帮助我们以更简单的方式跟踪每个作业的状态,但我找不到如何将依赖项发送到作业筛选器的示例 我们使用依赖注入(DI)和存储库+工作单元模式运行ASP.NETCore 如何从作业筛选器中访问数据库上下文(或工作单元,或通过DI提供的任何其他项) 多谢各位 编辑 我创建了一个存储库,其中包含一个小样本项目,概述了我在这里要做的工作:

我们将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
扩展方法