在 .NET 5 Web API 中动态连接到多个数据库(取决于经过身份验证的用户)

Posted

技术标签:

【中文标题】在 .NET 5 Web API 中动态连接到多个数据库(取决于经过身份验证的用户)【英文标题】:Connecting to multiple databases, dynamically (depending on the authenticated user) in an .NET 5 Web API 【发布时间】:2021-08-20 13:34:41 【问题描述】:

我们目前有一个 CMS,我们的客户可以使用它来管理我们为他们制作的网站的内容和某些设置。我们有一个包含所有客户列表的主数据库。然后,每个客户都有自己的数据库,其中包含他们的所有数据。我们总是先连接到主数据库,然后查找客户并使用该信息连接到客户的数据库并获取他们的数据。

我们正在努力在 .NET 5 中重新构建我们的 CMS(及其 API)。我们对所有服务和数据库连接使用依赖注入。目前我们有一个IDatabaseConnection,实现mysqlDatabaseConnectionMsSqlConnection。这有一些用于执行查询、启动事务等的功能。构造函数有一个IOptions<MySettings> 来注入来自appSettings.json 的设置,其中包含连接字符串。

这适用于主数据库,但我们正在尝试找出连接到客户数据库的最佳方式,因为这些数据库的连接字符串来自主数据库,我们事先并不知道它们。

我们一直在考虑为此创建一个工厂,但不确定在这种特定情况下如何做到这一点。我们发现的另一件事是我们实现了多租户,但也不确定这是否是最好的方式。我们也可以在我们的实现中添加一个空的构造函数,并在需要时手动创建实例并设置正确的连接字符串,但这似乎是一种反模式?或者是否有可能注入我们IDatabaseConnection 的2 个实例,然后为其中一个手动设置连接字符串?

当我们在线查找信息时,我们大多会遇到实体框架或其他对象数据库映射器或使用 DbContext 的解决方案,但据我所知,我们不能使用类似的东西,因为我们的 CMS 也有动态查询诸如此类的事情(如果您需要更多上下文,我可以对此进行更多解释)。

那么对于处理这样的用例,您有什么建议/建议吗?您需要我们目前拥有的任何代码示例吗?

【问题讨论】:

【参考方案1】:

几天前我也遇到了同样的问题。

您可以通过以下方式即时更改连接字符串:

myDbContext.Database.GetDbConnection().ConnectionString = $@"Data Source=.\SqlExpress;Initial Catalog=dataasename;Integrated Security=True";

如果您想使用自定义连接字符串,您可以像这样创建 DbContext:

public static MyDbContext GetMyDbContext(string databaseName)

    var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();

    optionsBuilder.UseSqlServer($@"Data Source=.\SqlExpress;Initial Catalog=databaseName;Integrated Security=True");

    return new MyDbContext(optionsBuilder.Options);


【讨论】:

感谢您的回答,但这并不是我真正要问的。我想知道让我的 IDatabaseConnection 有 2 个不同实例以及不同数据库的两个实例的最佳方法。另外,就像我说的,我们不使用 DbContext/Entity Framework。 好的,抱歉。可能这有帮助:***.com/questions/39174989/…

以上是关于在 .NET 5 Web API 中动态连接到多个数据库(取决于经过身份验证的用户)的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker 容器中运行 .Net 5 API 时无法连接到 Postgres

Slack RTM API 连接到多个服务器

远程连接到 .net core 自托管 web api

将托管在 AWS EC2 上的 Asp.net Web api 连接到 AWS API Gateway

无法从 NET Core 2.2 Web API 连接到 docker sql server

.NET 客户端连接到 ssl Web API