首页 > 解决方案 > 登录时在启动类中注册服务

问题描述

我正在开发一个有多个租户的应用程序。通过存储在数据库中的连接字符串,每个租户都可以与用户相关联,以标识其将有权访问的数据库。我遇到的问题是我只在用户登录时识别这个连接字符串,但是我需要在执行 StartUp 类时注册这个连接字符串。

我尝试使用会话变量来执行此操作,我让 StartUp 类的 ConfigureServices 方法以正确的值再次运行,但我无法让这个新配置生效。

services.AddScoped<IDapperContext>(s => new DapperContext(connectionString));

我想我需要重建才能使新设置生效。我怎样才能做到这一点?我在正确的道路上吗?有没有其他方法可以解决这个问题?

标签: .net-core

解决方案


我最近阅读了这篇文章,其中讨论了将 HTTPContext 注入您的服务。

https://www.strathweb.com/2016/12/accessing-httpcontext-outside-of-framework-components-in-asp-net-core/

获得上下文后,您可以获取经过身份验证的用户,并从第二个数据库或将用户映射到数据库的源中检索连接字符串。您必须在构建上下文期间配置上下文选项,以便将上下文的连接字符串控制为范围服务。

您可能需要考虑使用上下文工厂来代替为您执行此操作。

startup.cs 中的代码将使用您的连接字符串为数据库添加一个上下文,然后您的工厂将接受它作为注入的依赖项。您的工厂还将接受 IHttpContextAccessor 作为依赖项,使您可以访问上下文中的用户。然后,您可以一起获取连接字符串,并将 DbContextOptions 连接起来以传递给您的上下文的新实例。

对我来说,这似乎是 DI 最简单的方法。


推荐阅读