【问题标题】:Autofac: Custom LifetimeScopeAutofac:自定义 LifetimeScope
【发布时间】:2026-02-01 16:30:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 ioc-container autofac multi-tenant


    【解决方案1】:

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

    我认为你可以用 Autofac.Extras.Multitenant 做你想做的事,尽管你会想要彻底测试它(和let us know if it's broken)。

    • 租户没有不同的依赖关系,只有实例中存储的数据:在容器级别注册公共依赖关系,但对于每个租户具有不同数据的实例,将它们注册为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());
    

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

    【讨论】:

    • @Glenn 甚至可能意味着动态创建租户实例,而不是创建新类型的租户?认为这将使 Autofac MultiTenant 成为本垒打:)
    • @NicholasBlumhardt 我将稍微修改我的答案:重新调查,我不明白为什么您不能即时添加租户。只要您不重复租户 ID...应该没问题。
    • 我会在有时间的时候对其进行测试,并用结果更新这些问题。 @NicholasBlumhardt,您走在正确的轨道上,我只需要一种类型的租户,其中包含许多要即时创建的实例。我还没有看,但是有没有办法确认之前注册的租户 ID?