0
のサービスを解決できません

私はマルチテナントアプリケーションのためのsaaskitマルチテナントプロジェクトを使用しています。InvalidOperationException:タイプ

私はテナントコンテキストを作成でき、すべてのコントローラにアクセスできます。

しかし、時にはそれが

未処理の例外が発生したエラー、次の私を与える: 型「LMS.Model.AppTenant」のサービスを解決できません 「LMS.Controllers.OrganizationController」をアクティブにしようとしたとき。

このエラーは、コントローラと実行されたアクションメソッドでランダムに発生します。エラーの性質は、コントローラ/アクションメソッドに固有のものではありません。私は私のコードを見ることができます

は、実際にテナントを返すんどの成功しTenantResolverに入るが、それはDIが私のコントローラにそれを注入するために来るときには、このエラーは私のアプリケーションが完全に停止が発生した後にエラーが

を記載されていると文句を言います白い画面が表示されます。

この問題は、本番サーバーで発生し、localhostでは発生しません。

これに関する助け!この

public class HomeController 
    { 
     public HomeController(TenantContext<AppTenant> tenantContext) 
     { 

     } 
    } 

と以下のように、すべてのコントローラに注入

テナントはtenantContextが、注射

public static class MultitenancyServiceCollectionExtensions 
    { 
     public static IServiceCollection AddMultitenancy<TTenant, TResolver>(this IServiceCollection services) 
      where TResolver : class, ITenantResolver<TTenant> 
      where TTenant : class 
     { 
      Ensure.Argument.NotNull(services, nameof(services)); 

      services.AddScoped<ITenantResolver<TTenant>, TResolver>(); 

      // Make Tenant and TenantContext injectable 
      services.AddScoped(prov => 
       prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenant<TTenant>()); 

      services.AddScoped(prov => 
       prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenantContext<TTenant>()); 

      // Ensure caching is available for caching resolvers 
      services.AddMemoryCache(); 

      return services; 
     } 
    } 

この感謝の任意のヘルプ作られているため拡張クラスです!

答えて

1

あなたはそうすることはできません。問題は、あなたの登録である:

// Make Tenant and TenantContext injectable 
services.AddScoped(prov => 
    prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenant<TTenant>()); 

services.AddScoped(prov => 
    prov.GetService<IHttpContextAccessor>()?.HttpContext?.GetTenantContext<TTenant>()); 

それらの両方がnullすることができます!依存関係を登録するときには、NEVERnullになる必要があります。

この場合、たとえばTenantが常に返され、テナント情報がない場合は、汎用または初期化されていないTenantインスタンスを返します。 TenantContext<AppTenant>と同じです。それは常にnullではありませんが、テナントに有効なテナント情報が含まれている必要はありません。つまり、IsValidプロパティで有効なテナントかどうかを確認できます。

テナントが含まれているURL部分を誤って入力した場合、またはテナントヘッダーのないページにアクセスした場合(またはテナントを処理している場合)、テナントが無効な場合があります。

この問題が発生するのは、サービスがリクエスト(スコープ)ごとに発生するためです。そのため、リクエストごとに、ファクトリメソッドを再度呼び出してnullになる可能性があります。

+0

私の質問は何ですか?なぜそれがnullになっていますか?初期化されていないテナントインスタンス(デフォルトのテナント)を提案したように、その部分が処理される無効なURL /テナント名を入力すると、だから、私はSingleton OR Transientを登録する必要がありますか? – Rohit

+1

シングルトンではなく、有効期間内のジョブです。しかし、あなたが投稿したコードを見ると、古いバージョンのSaaskitを使用しているようです。コードは1.1.3以降です。 1.1.4からのコードは少し違って見えるhttps://github.com/saaskit/saaskit/blob/1.1.4/src/SaasKit.Multitenancy/MultitenancyServiceCollectionExtensions.cs – Tseng

+0

Okがチェックします!また、私は 'AppTenantResolver'クラスのSessionに' TenanContext'を設定しているので、テナントを何度も解決する必要はありません。しかし、このセッション値は、実行されたアクションメソッドに対してnullになることがあります。 'context.Session.SetObjectAsJson(" TenantContext "、tenantContext);'なぜこのHttpContextセッションがnullになるのですか?このため私はテナントのコンテキストを取得することができません – Rohit

関連する問題