我有一个需要使用Hangfire的SaaS项目。我们已经实现了识别租户的要求。
体系结构
TenantCurrentService
,它从源主机名、查询字符串等列表中返回租户的ID。DbContextFactory
,它为客户端返回一个带有正确连接字符串的DB上下文
问题
我正在尝试将一个TenantId标记为一个作业,从TenantCurrentService
(它是一个作用域服务)中检索。
然后执行作业时,我们需要从作业中检索TenantId
并将其存储在HangfireContext
中,这样TenantCurrentService
就知道从Hangfire检索到的TenantId了。然后,我们的应用层将能够从我们的DbContextFactory
连接到正确的数据库。
电流状态
IClientFilter
。有关于这件事的好文章吗?或者你们能提供的任何建议吗?
发布于 2019-08-07 14:19:54
首先,您需要能够在您的TenantId
中设置TenantCurrentService
。然后,您可以依赖于过滤器:
客户端(您在其中登记作业)
public class ClientTenantFilter : IClientFilter
{
public void OnCreating(CreatingContext filterContext)
{
if (filterContext == null) throw new ArgumentNullException(nameof(filterContext));
filterContext.SetJobParameter("TenantId", TenantCurrentService.TenantId);
}
}
和服务器端(作业退出队列的地方)。
public class ServerTenantFilter : IServerFilter
{
public void OnPerforming(PerformingContext filterContext)
{
if (filterContext == null) throw new ArgumentNullException(nameof(filterContext));
var tenantId = filterContext.GetJobParameter<string>("TenantId");
TenantCurrentService.TenantId = tenantId;
}
}
当您通过IJobFilterProvider
配置服务器时,可以声明服务器筛选器
var options = new BackgroundJobServerOptions
{
Queues = ...,
FilterProvider = new ServerFilterProvider()
};
app.UseHangfireServer(storage, options, ...);
其中ServerFilterProvider是:
public class ServerFilterProvider : IJobFilterProvider
{
public IEnumerable<JobFilter> GetFilters(Job job)
{
return new JobFilter[]
{
new JobFilter(new CaptureCultureAttribute(), JobFilterScope.Global, null),
new JobFilter(new ServerTenantFilter (), JobFilterScope.Global, null),
};
}
}
可以在实例化BackgroundJobClient时声明客户端筛选器。
var client = new BackgroundJobClient(storage, new BackgroundJobFactory(new ClientFilterProvider());
其中ClientFilterProvider
作为ServerFilterProvider
运行,传递客户端筛选器
一个困难可能是让TenantCurrentService在过滤器中可用。我想这应该可以通过在FilterProviders中注入工厂并将其链接到过滤器来实现。
我希望这能帮上忙。
https://stackoverflow.com/questions/57394712
复制相似问题