【发布时间】:2019-11-19 11:06:46
【问题描述】:
我正在尝试使用与我的 .NET Core 2.2 Web 应用程序具有相同架构结构的多个数据库(使用依赖注入方法 + 实体框架)。我想让用户可以在运行时选择(或更改)数据库。所以我有2个问题。
1.是否可以在运行时更改DbContext?
2.启动应用后是否可以配置(依赖注入)DbContext?
如果是这样,怎么做?
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<MyDbContext>(option => option.UseMySql(Configuration.GetConnectionString("DevConnection")));
// Can I declare this after launching the app? or Can it be changed at Runtime?
...
【问题讨论】:
-
注入一个接受简单密钥的工厂,而不是上下文本身(想想 region/company/id)。控制器可以在 using 语句中直接对此进行操作,或者您可以将其放在“存储”后面以将业务逻辑与它一起存储并为您处理 DbContext 的创建和处置。
-
或者,将 DbContext 注入关闭来自用户身份验证令牌的 url 参数或值等。IMO 这是一种更加 DRY 的方法。
-
嗨,谢谢 cwharris,DRY 意味着更简单?但在这种方法中,您将如何在运行时更改 dbContext?
-
这取决于注入的依赖项的生命周期。例如,在 ASP.NET MVC 中,您可以声明具有请求生命周期的依赖项。这意味着依赖项将在收到请求后、创建控制器之前实例化,并在发送响应后(或类似的东西)销毁。您可以通过查看 URL 参数或身份验证令牌中的值来在您的工厂方法中利用这一点,以确定您应该创建和注入哪个 DbContext,仅特定于该请求..
-
DRY 是一种软件原则,意思是“不要重复自己”。你可以在这里阅读更多信息en.m.wikipedia.org/wiki/Don%27t_repeat_yourself
标签: c# asp.net-core dependency-injection .net-core entity-framework-core