[以前に回答し、その場で新しいテナントを登録できないことを示しました。それは間違っていたので、それに応じて更新しています。
Autofac.Extras.Multitenantを使用して、やりたいことができると思いますが、徹底的にテストする必要があります(壊れている場合はお知らせください)。
- テナントには異なる依存関係はなく、インスタンス内に格納されているデータのみがあります。コンテナレベルで共通の依存関係を登録しますが、テナントごとに異なるデータを持つインスタンスの場合は、それらをとして登録し
InstancePerTenant
ます。
- データの漏洩を防ぐために、テナントごとに必要なインスタンスがいくつかあります
InstancePerTenant
。登録拡張機能を使用します。
- WebサイトにアクセスするURLに基づいてテナントを決定します。URLを
ITenantIdentificationStrategy
確認してテナントIDに変換する独自の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));
アプリの実行中にテナントを作成する必要がある場合は、以前にテナントを構成していない(重複するテナント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());
実はそれと同じくらい簡単だと思います。繰り返しますが、既存のテナントを再構成しようとしない限り、問題はありません。