首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在控制台应用程序中使用依赖项注入对多个租户进行动态范围依赖解析

在控制台应用程序中使用依赖项注入对多个租户进行动态范围依赖解析
EN

Stack Overflow用户
提问于 2022-02-11 13:38:19
回答 1查看 302关注 0票数 1

在Web的情况下,每个请求都是不同的作用域,注册为作用域的依赖关系将在每个请求中得到解决。因此,解决每个租户每个请求的依赖关系很容易,因为可以在中传递租户信息(如TenantId),如下所示:

代码语言:javascript
运行
复制
services.TryAddScoped<ITenantContext>(x =>
{
    var context = x.GetService<IHttpContextAccessor>().HttpContext;
    var tenantId = context.Request.Headers["TenantId"].ToString();
    var tenantContext = GetTenantContext(tenantId);
    return tenantContext;
}

其他注册首先解析TenantContext并使用它解决其他依赖关系。例如,IDatabase将注册如下。在解析过程中,它将解析并连接到特定的租户数据库。

代码语言:javascript
运行
复制
services.TryAddScoped<IDatabase>(x =>
{
    var tenantContext = x.GetService<ITenantContext>();
    return new Database(tenantContext.DatabaseConnectionString);
}

这在Web服务中是很好的,因为每个请求都是一个作用域。我面临在多租户控制台应用程序中使用依赖注入的挑战。假设应用程序处理多租户队列中的项目,并且每条消息可以属于不同的租户。在处理每条消息时,它将数据提交给特定于租户的数据库。因此,在本例中,作用域是队列中的每个消息,消息包含tenantId。

因此,当应用程序从队列中读取消息时,它需要获取TenantContext。然后基于此TenantContext解决其他依赖关系。

我看到如何实现这个动态解析的一个简单的选择是使用TenantContext手动创建依赖对象,但这样我就无法利用依赖注入。在消息处理之后,所有对象都将在超出作用域后手动创建和释放。

代码语言:javascript
运行
复制
var messgage = GetMessageFromQueue(queueName);
var tenantContext = GetTenantContext(message.TenantId);
var database = GetDatabaseObject(tenantContext);
// Do other processing now we got the database object connected to specific tenant DB

在DI中是否有一个选项,我可以动态地传递TenantId,以便为这个作用域设置TenantContext,然后在这个范围内进行进一步的解析利用这个TenantContext

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-11 18:10:58

由于租约的角色超出了实现(“此使用X数据库”),实际上与正在执行的操作(“它使用X数据库,必须根据操作中处理的上下文使用此连接字符串”)有关联,因此存在一些风险,即假定环境上下文存在于替代实现中,因为它没有在接口中以某种方式明确描述,这就是DI问题出现的地方。

你也许可以:

  1. 更新您的接口,以便租赁信息是您的方法的预期参数。这确保了无论将来实现如何,租户ID的存在在它们的签名中都是明确的:

公共接口ITenantDatabase {公共TResponse Get(string TenantId,int );//.其他方法. }

  1. 在现有接口周围添加一个工厂包装器,以处理在对象创建时分配上下文的问题,并让该工厂返回IDatabase实例。这基本上是您手动提出的,但是在它周围有一个抽象,您可以注册和注入,以使利用它的代码不对逻辑负责:

公共接口ITenantDatabaseFactory { public IDatabase GetDatabaseForTenant(int TenantId);} //添加手动生成和返回作用域对象的实现

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71081028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档