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

C# 在.NET 5 Web API中动态(取决于经过身份验证的用户)连接到多个数据库,c#,.net-core,dependency-injection,asp.net-core-webapi,.net-5,C#,.net Core,Dependency Injection,Asp.net Core Webapi,.net 5,我们目前有一个CMS,我们的客户可以使用它来管理我们为他们制作的网站的内容和特定设置。我们有一个包含所有客户列表的主数据库。每个客户都有自己的数据库,其中包含他们的所有数据。我们总是先连接到主数据库,然后查找客户并使用该信息连接到客户的数据库并获取他们的数据 我们正在.NET5中重新设计CMS(及其API)。我们对所有服务和数据库连接使用依赖注入。目前,我们有一个IDatabaseConnection和MsSqlConnection的实现。这有一些用于执行查询、启动事务等的函数。构造函数有一个I

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

我们正在.NET5中重新设计CMS(及其API)。我们对所有服务和数据库连接使用依赖注入。目前,我们有一个
IDatabaseConnection
MsSqlConnection
的实现。这有一些用于执行查询、启动事务等的函数。构造函数有一个
IOptions
,用于从包含连接字符串的
appSettings.json
注入设置

这对于主数据库来说很好,但是我们正在尝试找到连接到客户数据库的最佳方式,因为这些数据库的连接字符串来自主数据库,我们事先不知道它们

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

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


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

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

您可以通过以下方式动态更改connectionstring:

myDbContext.Database.GetDbConnection().ConnectionString = $@"Data Source=.\SqlExpress;Initial Catalog={dataasename};Integrated Security=True";
如果要使用自定义connectionstring,可以创建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);

}
public静态MyDbContext GetMyDbContext(字符串数据库名)
{
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer($@“数据源=。\SqlExpress;初始目录={databaseName};集成安全性=True”);
返回新的MyDbContext(optionsBuilder.Options);
}

谢谢你的回答,但这不是我真正想问的。我想知道将IDatabaseConnection的两个不同实例以及两个实例用于不同数据库的最佳方法。另外,正如我所说,我们不使用DbContext/entityframework.OK,对不起。这可能有助于: