【问题标题】:Autofac, best practices on runtime adding tenants?Autofac,运行时添加租户的最佳实践?
【发布时间】:2017-02-06 12:48:43
【问题描述】:

我正在使用多租户容器,每个租户都有自己的数据库 + 在 InstancePerLifeTime 范围内注册的连接字符串。租户使用子域来标识,该子域映射到具有生成的数据库名称的“主数据库”中。

现在我有两个用例:

用例 A:创建新租户: 有人用公司名称填写注册表,提交,提交后我们生成一个新数据库,该租户应该能够访问 companyname.domain.com 下的应用程序

但是我们希望在不重新启动影响所有当前租户的应用程序的情况下这样做。

假设我想添加一个新租户运行时。在不重新启动应用程序的情况下注册它的最佳方法是什么?

起初我考虑注册容器,将其注入我的 MVC 控制器,然后添加新的注册运行时,但在阅读了一些问题后,这似乎是不好的做法。

我还可以从 Controller 中获取 DependencyResolver 并从那里访问容器。有更好的做法吗?

用例 B:按需注册

假设我们有大量租户,并且希望防止在应用程序启动时一次性注册所有租户。当子域可以与现有帐户匹配时,我们可以在第一次请求时在多租户容器中注册这些。

不过,这可能是过早的优化,因为基本上我们还没有很多租户。

但同样,这会导致运行时注册。

容器:

        var tenantIdentificationStrategy= new TenantIdentificationStrategy();
        var multitenantContainer = new MultitenantContainer(tenantIdentificationStrategy, builder.Build());
        var tenants = new[]
        {
            "companyA.domain",
            "localhost"
        };

        foreach (var id in tenants)
        {
            var databaseName = $"tenant-{id}";


            multitenantContainer.ConfigureTenant(id, b =>
            {
                // Init RavenDB 
                b.Register(context => new RavenDocumentSessionFactory(databaseName))
                    .InstancePerTenant()
                    .AsSelf();

                // Session per request
                b.Register(context => context.Resolve<RavenDocumentSessionFactory>()
                    .FindOrCreate(context.Resolve<IDocumentStore>()))
                    .As<IDocumentSession>()
                    .InstancePerLifetimeScope()
                    .OnRelease(x =>
                    {
                        x.SaveChanges();
                        x.Dispose();
                    });

            });
        }

【问题讨论】:

    标签: c# model-view-controller autofac multi-tenant


    【解决方案1】:

    最好的办法是在某处保存对应用程序容器的静态引用并从那里注册您的租户。这是很常见的做法,并且由于您的租户注册代码无论如何都必须“知道”MultitenantContainer 是什么,因此它不会更改您的程序集引用或传播容器的“知识”。否则必须是。

    • 在应用启动时创建多租户容器。
    • 注册您已经知道的租户。
    • 将容器存储在全局可访问的静态属性中。
    • 在需要注册租户时引用静态属性。

    【讨论】:

    • 嗨,Travis,基于围绕“如何使容器可从应用程序内访问”的其他一些问题,通过静态引用使容器可用似乎是不好的做法。很想听听您对此的看法。
    • 如果您将其用于服务定位(抓取容器并直接解决某些问题),那就不好了。这不是那个。
    猜你喜欢
    • 2010-11-01
    • 2021-03-20
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多