Autofac: Пользовательский LifetimeScope
Я создаю мультитенантное приложение MVC 4 и использую Autofac в качестве контейнера.
Я смотрел на библиотеку Autofac MultiTenant, однако, если я не пропустил что-то, я не думаю, что это действительно соответствует тому, что мне нужно. Это моя ситуация:
- я не знаю всех арендаторов заранее, и новые будут созданы во время выполнения
- арендаторы не имеют различных зависимостей, только данные, хранящиеся в экземплярах
- у меня есть несколько примеров, которые нужно быть на одного арендатора, Чтобы не допустить утечки данных
- у меня есть несколько экземпляров, которые будут единственным экземпляром в корневом контейнере (не проблема)
- у меня есть несколько экземпляров, которые будут по запросу http (не проблема)
- я определяю арендатора на основе URL-адреса, по которому они обращаются к веб-сайту
Я не смог найти ничего, что соответствовало бы моим потребностям, поэтому я думаю, что мне нужно найти способ создать свои собственные области жизни для каждого арендатора. Как бы я стал действовать? создание таких как вещь?
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());