2

マルチテナント MVC 4 アプリケーションを構築しており、コンテナーとして Autofac を使用しています。

私はAutofac MultiTenantライブラリを見てきましたが、何かを見落としていない限り、私が必要としているものに本当に合っているとは思いません. これは私の状況です:

  • 前もってすべてのテナントを把握しているわけではなく、実行中に新しいテナントが作成される
  • テナントは異なる依存関係を持たず、インスタンス内に保存されたデータのみ
  • データが漏洩しないようにするために、テナントごとに必要なインスタンスがいくつかあります
  • ルート コンテナー内に単一のインスタンスになるインスタンスがいくつかあります (問題ではありません)。
  • httpリクエストごとのインスタンスがいくつかあります(問題ではありません)
  • Web サイトにアクセスする URL に基づいてテナントを決定します

ニーズに合ったものを見つけることができなかったので、テナントごとに独自の有効期間スコープを作成する方法を検討する必要があると思います。そのようなものを作成するにはどうすればよいですか?

4

1 に答える 1

3

[以前に回答し、その場で新しいテナントを登録できないことを示しました。それは間違っていたので、それに応じて更新しています。

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

実はそれと同じくらい簡単だと思います。繰り返しますが、既存のテナントを再構成しようとしない限り、問題はありません。

于 2013-03-11T15:01:10.913 に答える