【问题标题】:How to DI an EF 6 Service with dynamic connection string如何使用动态连接字符串执行 EF6 服务
【发布时间】:2015-09-17 17:54:34
【问题描述】:

我们的数据库设置有一个管理数据库和多个客户端数据库。当用户登录时(通过管理数据库),我们确定他们应该使用哪个客户端数据库并返回该连接字符串以供将来使用(存储在会话中)。

我真的很喜欢 this answer 处理 EF6 的方式,并希望实现类似的东西,但我不确定如何使用 DI 并更新连接字符串。

使用 DbConnection 直接更新 DbContext 上的连接字符串。它只是通过一些我目前没有看到的 DI 机制干净地创建和更新 DbContext 的能力。

【问题讨论】:

  • 不清楚你的问题是什么
  • 这取决于您的 dbcontext 是如何构建的,以及您使用的 DI 框架。
  • @Eris 我还没有选择 DI 框架。我现在正在研究 Unity 和 StructureMap。是否有任何 DI 框架比其他框架更优雅地解决它?
  • @Evk 我不想在创建客户端 DbContext 时指定连接字符串。 admin DbContext 很简单,因为它将使用来自 web.config 的连接字符串。不知何故,我想使用 DI 帮助将该用户的连接字符串“注入”到客户端 DbContext 中。
  • 如何为 ClientContext 创建一个装饰器类,它注入了 HttpContext container.RegisterType(new InjectionFactory(c => HttpContext.Current));然后在ClientContext的ctor中,从session中获取连接字符串,更新包含的DbContext?

标签: c# asp.net-mvc entity-framework dependency-injection


【解决方案1】:

DI 是编译时过程,但是您可以在运行时根据某些条件使用工厂模式来实例化一个类(从一组继承自同一接口的类)做一些决定

作为您的问题的解决方案,您可以使用静态函数返回适当的连接字符串,不需要 DI

public static class ConnectionStringPorvider
{
    public static string getConnectionString()
    {
        switch(dbName)
        {
         ....
        }
    }
}

在你的数据上下文类中

base(global::[class name space].ConnectionStringPorvider.getConnectionString(dbName), mappingSource)

【讨论】:

  • 虽然我 100% 同意您的回答(尽管您可以让 OP 更清楚一点),但 DI 不是“编译时间”过程,而是合成时间(启动)过程。
  • 静态类不能被mock、注入,完全不灵活。
  • 是的,我曾短暂考虑过这样做,但我希望有一种更优雅、更可测试的方法来做到这一点,希望是使用 DI。
  • 这是一个启动过程,但我不确定您是否可以根据条件做出以后的决定,我读过一篇关于使用装饰器的文章,但我不确定。在这种情况下可以应用工厂模式,我认为这是最合适的。
  • 糟糕,我没有看到课堂上的静态内容。我不建议这样做。最好创建一个非静态的抽象工厂来注入存储库类。然后抽象工厂在运行时通过公共方法决定创建哪个实例。
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
相关资源
最近更新 更多