2

我正在构建一个多租户 MVC 4 应用程序并使用 Autofac 作为容器。

我一直在看 Autofac MultiTenant 库,但是除非我错过了一些我认为它并不真正适合我需要的东西。这是我的情况:

  • 我不知道所有的租户都预先和新的租户将在执行期间创建
  • 租户没有不同的依赖关系,只有存储在实例中的数据
  • 我有一些需要每个租户的实例,以确保不泄漏数据
  • 我有一些实例将是根容器中的单个实例(不是问题)
  • 我有一些实例将根据 http 请求(不是问题)
  • 我根据他们访问网站的 URL 来确定租户

我找不到任何适合我需要的东西,所以我想我需要寻找一种方法来为每个租户创建自己的生命周期范围。我将如何去创造这样的东西?

4

1 回答 1

3

[我之前回答并表示您无法即时注册新租户。那是不正确的,我正在相应地更新。

我认为你可以用 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());

其实我觉得就这么简单。同样,只要您不尝试重新配置现有租户,您应该没问题。

于 2013-03-11T15:01:10.913 回答