注入存储库的动态连接字符串

时间:2013-05-30 18:39:24

标签: entity-framework dependency-injection structuremap multi-tenant

我正在构建一个多租户(每个租户数据库)应用程序。

  • 应用程序 - .net MVC4
  • 数据层实体框架代码第一个存储库
  • 通过结构图
  • 将存储库注入应用程序

结构图配置:

var connectionString = ConfigurationManager.ConnectionStrings["AccessControlDB"].ToString();

ObjectFactory.Initialize(x =>
    {
        x.For<IAccessControlContext>().Use<AccessControlContext>().Ctor<string>("connectionString").Is(connectionString);
        x.For<IGenericRepository<Identities>>().Use<GenericRepository<IAccessControlContext, Identities>>();
        x.Scan(scan =>
        {
            scan.AssembliesFromApplicationBaseDirectory();
            scan.ExcludeNamespace("StructureMap");
            scan.WithDefaultConventions();
        });
    });

已经出现了通过数据库隔离每个租户的新要求,因此使用tenantID已经不够了。

我已经拥有了一个元数据库来存储构建连接字符串所需的数据,但我对如何将连接字符串传递给存储库感到茫然。

首先,我认为我可以将连接字符串公开为属性,但是在上下文已经被structuremap实例化之后,无法更改连接字符串。

1 个答案:

答案 0 :(得分:2)

不要将连接字符串传递给存储库,而是执行以下操作:

  1. IContextFactory注入存储库。此上下文工厂可以创建新的DbContext实例。
  2. ITenantProvider注入连接工厂。
  3. 将上下文工厂注入存储库具有以下优点:

    1. 使配置容器变得相当容易,因为您消除了string值带来的歧义,这可以防止您必须将连接字符串注入到许多类中。
    2. 它允许您隐藏解析抽象背后的连接字符串的复杂性,因为上下文工厂现在负责创建正确的连接字符串(基于它从ITenantProvider实现获得的租户信息)。
    3. 通过从工厂返回新的DbContext实例而不是返回连接字符串,可以隐藏DbContext的创建。这使您的存储库更容易,并且以后更容易更改它。
    4. 请注意,我只是在猜测您的存储库是如何工作的,因此使用IContextFactory可能不是最佳选择。但是通过防止直接注入连接字符串并将其隐藏在抽象之后(甚至比返回连接字符串更多),您可以使DI配置和应用程序代码更加容易,并且维护和测试。