2017-01-26 7 views
0

Autofac.Extras.Multitenancyパッケージがインターフェイスの2つの実装のどちらかを選択するのに苦労しています。Autofac Web ApiマルチテナントがHTTPContext.Currentを取得しない

私はテナントIDに基づいて別々のデータベースに接続しようとしていますが、ITenantIdentificationStrategyは私がAutofacの例から取得したものではありません。HttpContext.Currentが設定されていないため、HTTP呼び出しから何も取得できません。私はこのような2つの構成を持っています。

var mtc = new MultitenantContainer(tenantIdStrategy, builder.Build()); 

mtc.ConfigureTenant(Guid.Parse("00000000-0000-0000-0000-000000000001"), b => b.RegisterInstance<DatabaseConnection>(connectionOne).As<IDatabaseConnection>().SingleInstance());     
mtc.ConfigureTenant(Guid.Parse("00000000-0000-0000-0000-000000000002"), b => b.RegisterInstance<DatabaseConnection>(connectionTwo).As<IDatabaseConnection>().SingleInstance()); 

var resolver = new AutofacWebApiDependencyResolver(mtc); 

config.DependencyResolver = resolver; 

appBuilder.UseWebApi(config); 

だから、それぞれ、私はインスタンス2つのデータベース接続を持っていると私はそれらのインスタンスは、各テナントのために使用したい

私のテナントIdが、私は単純なコントローラを追加

public class RequestParameterStrategy : ITenantIdentificationStrategy 
{ 
    public bool TryIdentifyTenant(out object tenantId) 
    { 
     tenantId = null; 
     try 
     { 
      var context = HttpContext.Current; 

      if (context != null && context.Request != null) 
      { 
       tenantId = HttpContext.Current.Request.RequestContext.RouteData.Values["tenantId"]; 
      } 
     } 
     catch (HttpException) 
     { 
      // Happens at app startup in IIS 7.0 
     } 
     return tenantId != null; 
    } 
} 

非常に単純ですこれはASP.NETパイプライン内にあるはずです。

public IHttpActionResult Get(IMongoDBAdapter adapter, string memberId= null) { 
    return Ok() 
} 

これは、Autofacのウェブサイトの例です。しかしHttpContext.Currentは常にnullで、テナントIDが設定されていないし、それは私のコントローラのは 私は私の問題は、このプロジェクトがIISでホストされていないことかもしれないと思うDatabaseConnection

EDITを取得していないことを不平を言います。それは自己ホストされたWindowsサービスであり、コントローラHttpContext.Currentでさえもnullです。このアイデアのように思えますが、自己ホスト型サービスでは不可能かもしれませんか?

あなたが正しい
+0

障害の発生しているオブジェクトをいつ解決するのですか? (質問の本文を更新してください。)リクエストに含まれていない場合(ASP.NETパイプラインでHttpContext.Currentがまだ設定されていないなど)、できることはあまりありません。そのドキュメンテーションの例は単なる例に過ぎず、スティックを振るよりも多くの免責事項があります。独自の例外的なケースを処理するために、個人的なニーズにいくつかの修正を加えなければならない場合があります。 –

+0

[混乱を避けるために_even more disclaimers_でドキュメントを更新しました。](http://autofac.readthedocs.io/en/latest/advanced/multitenant.html) –

+0

@TravisIlligは、返信とドキュメントの更新に感謝します。しかし、私が言及しなかった大きな部分は、これがWindowsサービスでホストされているということでした。 IIS経由ではありません。それはHttpContext.Currentは常にnullになるようです...バマー.... – ThrowsException

答えて

関連する問題