鉴于您希望在构造函数中设置备用连接字符串,则表明它是一个已知值。要解决的问题是如何用DI做到这一点。第一个提示是在基架上下文时生成的代码:protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){ if (!optionsBuilder.IsConfigured) {//#warning To protect potentially sensitive information in your// connection string, you should move it out of source code.// See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. optionsBuilder.UseSqlServer("Server=.\\SQLEXPRESS;Database=MyDb;Trusted_Connection=True;"); }}这意味着您可以使用默认配置(optionsBuilder.IsConfigured),在启动时设置该值。但也要在建筑上使用替代方案。然后,代码将如下所示:public partial class MyContext : DbContext{ private readonly string _connectionString; public MyContext(DbContextOptions<MyContext> options) : base(options) { } public MyContext(IOptions<DbConnectionInfo> dbConnectionInfo) { _connectionString = dbConnectionInfo.Value.MyContext; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(_connectionString); } }}其中,帮助程序类如下所示:public class DbConnectionInfo{ public string MyContext { get; set; }}示例 appsettings.json:"ConnectionStrings": { "MyContext": "Server=.\\SQLEXPRESS;Database=MyDb;Trusted_Connection=True;" },并在启动时注册两者:services.Configure<DbConnectionInfo>(settings => configuration.GetSection("ConnectionStrings").Bind(settings));services.AddScoped<MyContext>();如果您不想从配置中读取连接字符串,而是根据中间件(例如,每个租户)进行设置,则可以使用相同的方法。只需在构造上下文之前更新值即可。更新:使用依赖注入,您不需要自己构造对象,而是将已注册的对象/服务作为参数传递。DI 将确定需要以什么顺序创建哪些对象。以同样的方式,对象将在使用后由DI处理。控制器“知道”上下文的事实是,DI 会自动将其添加为参数。上下文“知道”DbConnectionInfo 的事实是因为它已注册到 DI。如果要更改 DbConnectionInfo,则需要以正确的方式添加它。在你的情况下,你可以做这样的事情:// Added as part of the exampleservices.AddHttpContextAccessor();// Replace registration with this line:services.AddScoped<DbConnectionInfo>();// Register the DbContextservices.AddScoped<MyContext>();其中类的替代版本是:public class DbConnectionInfo{ public string MyContext { get; set; } // Example injecting IHttpContextAccessor // On creating this class DI will inject // the HttpContextAccessor as parameter public DbConnectionInfo(IHttpContextAccessor httpContextAccessor) { // Access the current request var request = httpContextAccessor.HttpContext.Request; // Access the current user (if authenticated) var user = httpContextAccessor.HttpContext.User; // Now you could get a value from a header, claim, // querystring or path and use that to set the value: MyContext = ""; } }在 DbContext 中,稍作更改,在这种情况下,我们不会使用 IOptions:public partial class MyContext : DbContext{ private readonly string _connectionString; public MyContext(DbConnectionInfo dbConnectionInfo) { _connectionString = dbConnectionInfo.MyContext; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(_connectionString); } }}现在,对于每个请求,将在创建 MyContext 之前设置该值。