【问题标题】:.NET Core 2.2 Web Application. DbContext was setup by Dependency Injection Can it be changed at Runtime?.NET Core 2.2 Web 应用程序。 DbContext 是由依赖注入设置的,它可以在运行时更改吗?
【发布时间】: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


【解决方案1】:

我想通了。并在其他线程中分享。 如果有人感兴趣,请查看

https://stackoverflow.com/a/57064965/4735043

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 2021-01-23
    • 2023-03-03
    • 2019-11-20
    • 2019-09-14
    • 2019-05-07
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多