Autofac: Пользовательский LifetimeScope


Я создаю мультитенантное приложение MVC 4 и использую Autofac в качестве контейнера.

Я смотрел на библиотеку Autofac MultiTenant, однако, если я не пропустил что-то, я не думаю, что это действительно соответствует тому, что мне нужно. Это моя ситуация:

  • я не знаю всех арендаторов заранее, и новые будут созданы во время выполнения
  • арендаторы не имеют различных зависимостей, только данные, хранящиеся в экземплярах
  • у меня есть несколько примеров, которые нужно быть на одного арендатора, Чтобы не допустить утечки данных
  • у меня есть несколько экземпляров, которые будут единственным экземпляром в корневом контейнере (не проблема)
  • у меня есть несколько экземпляров, которые будут по запросу http (не проблема)
  • я определяю арендатора на основе URL-адреса, по которому они обращаются к веб-сайту

Я не смог найти ничего, что соответствовало бы моим потребностям, поэтому я думаю, что мне нужно найти способ создать свои собственные области жизни для каждого арендатора. Как бы я стал действовать? создание таких как вещь?

1 2

1 ответ:

[я ранее ответил и указал, что вы не можете зарегистрировать новых арендаторов на лету. Это было неверно, и я обновляю соответственно.

Я думаю, вы можете делать с Autofac все, что хотите.Дополнительный.Мультитенант, хотя вы захотите проверить его тщательно (и сообщите нам, если он сломан).
  • арендаторы не имеют различных зависимостей, только данные, хранящиеся в экземплярах: регистрируйте общие зависимости на уровне контейнера, но для экземпляров, которые имейте разные данные для каждого арендатора, регистрируйте их как InstancePerTenant.
  • у меня есть несколько экземпляров, которые должны быть для каждого арендатора, чтобы гарантировать отсутствие утечки данных : используйте расширение регистрации InstancePerTenant.
  • я определяю арендатора на основе URL-адреса, по которому они обращаются к веб-сайту с помощью : реализуйте свой собственный ITenantIdentificationStrategy, который просматривает URL-адрес и преобразует его в идентификатор арендатора.

Новые арендаторы должны быть зарегистрированы во время выполнения пункт был то, что я ранее был думать не получится, но теперь я думаю, что получится.

Когда вы создаете клиент при запуске приложения, это выглядит следующим образом:

// 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));

Если вам нужно создать клиента во время выполнения приложения, вы должны иметь возможность сделать это до тех пор, пока вы ранее не настроили клиента (без повторяющихся идентификаторов клиента).

Я думаю, что это сработало бы примерно так:

// 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());
На самом деле, я думаю, что все очень просто. Опять же, если вы не пытаетесь перенастроить существующий клиент , вы должны быть в порядке.