1

我正在构建一个多租户(每个租户 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 已不再足够。

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

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

4

1 回答 1

2

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

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

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

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

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

于 2013-05-30T20:36:29.933 回答