【发布时间】: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