Autofac:自定义LifetimeScope

时间:2013-03-10 00:37:45

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

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

我一直在关注Autofac MultiTenant库,但除非我遗漏了一些东西,否则我认为它不符合我的需要。这是我的情况:

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

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

1 个答案:

答案 0 :(得分:3)

[我之前回答过并表示你无法动态注册新租户。这是不正确的,我正在相应更新。

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

  • 租户没有不同的依赖关系,只有实例中存储的数据:在容器级别注册公共依赖关系,但对于每个租户具有不同数据的实例,请注册为{{1 }}。
  • 我有一些需要每个租户的实例,以确保不会泄露数据:使用InstancePerTenant注册扩展程序。
  • 我根据用户访问网站的网址确定租户:实施您自己的InstancePerTenant,查看该网址并转换为租户ID。

新租户需要在执行期间进行注册项目是我以前认为无法运作但现在我认为会有效。

在app启动时创建租户时,就像这样:

ITenantIdentificationStrategy

如果您需要在应用运行时期间创建租户,只要您之前没有配置租户(没有重复的租户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));

实际上,我认为这很简单。同样,只要您不尝试重新配置现有租户,您应该没问题。