【问题标题】:dynamic connection string for injected repository注入存储库的动态连接字符串
【发布时间】:2013-05-30 18:39:23
【问题描述】:

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

  • 应用程序 - .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();
        });
    });

提出了让每个租户通过数据库隔离的新要求,因此拥有租户 ID 已不再足够。

我已经有了一个元数据库来存储构建连接字符串所需的数据,但我不知道如何将连接字符串传递到存储库。

起初,我以为我可以将连接字符串作为属性公开,但是在上下文已经被结构映射实例化后,无法更改连接字符串。

【问题讨论】:

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


    【解决方案1】:

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

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

    将上下文工厂注入存储库具有以下优点:

    1. 使配置容器变得相当容易,因为您消除了 string 值带来的歧义,这样您就不必将该连接字符串注入到许多类中。
    2. 它允许您在抽象背后隐藏解析连接字符串的复杂性,因为上下文工厂现在负责创建正确的连接字符串(基于它从ITenantProvider 实现中获得的租户信息)。李>
    3. 通过从工厂返回新的DbContext 实例而不是返回连接字符串,您可以隐藏DbContext 的创建。这使您的存储库更容易,并且以后更容易更改它。

    请注意,我只是在这里猜测您的存储库是如何工作的,因此使用IContextFactory 可能不是最佳选择。但是通过防止直接注入连接字符串并将其隐藏在抽象后面(甚至不仅仅是返回该连接字符串),您可以使您的 DI 配置和应用程序代码更容易维护和测试。

    【讨论】:

    • ITenantProvider 如何知道哪个租户正在请求数据?
    • 您目前如何确定请求是针对哪个租户?
    • 租户都在一个大数据库中,每个表都有一个tenant_id列。这样,就不需要提前知道租户是什么。但是,对于租户/数据库,我需要从元数据库中查找租户,构造连接字符串,然后将其传递到存储库。听起来唯一的选择是延迟上下文创建,直到我需要使用存储库,而不是由构造函数创建它?
    • 我的意思是,您是唯一知道如何选择合适租户的人,但我希望它是 cookie 或 url 中的信息。该行为应该放在 ITenantProvider 中。
    • @Yash:在 DAL 中定义 ITenentProvider 抽象,但在 MVC 层中定义实现(例如 AspNetTenentProvider)。这优雅地解决了问题。您的 DAL 不应该对所使用的演示技术有任何概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2011-08-11
    • 2014-02-17
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多