[我之前回答并表示您无法即时注册新租户。那是不正确的,我正在相应地更新。
我认为你可以用 Autofac.Extras.Multitenant 做你想做的事,尽管你会想要彻底测试它(如果它坏了,请告诉我们)。
- 租户没有不同的依赖关系,只有存储在实例中的数据:在容器级别注册公共依赖关系,但对于每个租户具有不同数据的实例,将它们注册为
InstancePerTenant
.
- 我有一些需要每个租户的实例,以确保不泄漏数据:使用
InstancePerTenant
注册扩展。
- 我根据他们访问网站的 URL 来确定租户:实现您自己的
ITenantIdentificationStrategy
,查看 URL 并转换为租户 ID。
在执行项目期间需要注册新租户是我以前认为行不通的事情,但现在我认为可以了。
在应用启动时创建租户时,如下所示:
// Configure application-level defaults.
var builder = new ContainerBuilder();
builder.RegisterType<Consumer>().As<IDependencyConsumer>().InstancePerDependency();
builder.RegisterType<BaseDependency>().As<IDependency>().SingleInstance();
var appContainer = builder.Build();
// Configure tenant identification and start the multitenant container.
var tenantIdentifier = new MyTenantIdentificationStrategy();
var mtc = new MultitenantContainer(tenantIdentifier, appContainer);
// Configure overrides for existing tenants.
mtc.ConfigureTenant('1', b => b.RegisterType<Tenant1Dependency>().As<IDependency>().InstancePerDependency());
mtc.ConfigureTenant('2', b => b.RegisterType<Tenant2Dependency>().As<IDependency>().SingleInstance());
// Set the MVC dependency resolver.
DependencyResolver.SetResolver(new AutofacDependencyResolver(mtc));
如果您需要在应用程序运行时创建租户,只要您之前没有配置过租户(没有重复的租户 ID),您应该能够做到这一点。
我认为它会像这样工作:
// Get the current application container.
var mtc = AutofacDependencyResolver.Current.ApplicationContainer as MultitenantContainer;
// Configure the new tenant.
mtc.ConfigureTenant('3', b => b.RegisterType<Tenant3Dependency>().As<IDependency>().InstancePerDependency());
其实我觉得就这么简单。同样,只要您不尝试重新配置现有租户,您应该没问题。