0

私は2つの異なるサイトで使用されるアプリケーションを持っています。各サイトには独自のデータベースがあります。Ninjectを使用してDbContextを切り替えるユーザーセッションごとに依存性注入

2つのDbContextが各サイトに1つあります。ユーザーが自分のアプリケーションを開くと、自分のサイトを選択するスプラッシュページが表示されます。サイトを選択した後、カーネルはリバウンドして、選択したサイトのDbContextを使用します。

ボブ&メアリーの説明のために今すぐ
private void RebindDbContext(string site) 
{ 
    switch (site) 
    { 
     case "Site1": 
      _kernel.Rebind<DbContext>().To<DbContext1>().InRequestScope(); 
      break; 
     case "Site2": 
      _kernel.Rebind<DbContext>().To<DbContext2>().InRequestScope(); 
      break; 
    } 
} 

ボブはサイト1を選択しかし、メアリーが選択したときに、ボブのためのdbContext 2.サイトは、私が欲しいサイト2に再結合しているときこれが正常に動作しますBobとMaryがお互いに影響を与えずに同時にアプリケーションを使用できるようにすることです。

私はTransientScope、ThreadScope、InRequest Scopeを使用しようとしましたが、これらのどれもうまくいきませんでした。

アプリケーションは、IISサーバー上

+1

この目的のためにninjectプロバイダを使用することはどうですか?または、再バインドの代わりにメソッドにバインドします。 – MaKCbIMKo

答えて

2

バインディングは、状態に依存しない、一度アプリケーションごとに行われることが意図されている任意の助け

感謝を実行されています。

1)、その後Ninject.Activation.IProvider

public class DbContextProvider : Ninject.Activation.IProvider 
{ 
    public Type Type 
    { 
     get { return typeof(DbContext); } 
    } 

    public object Create(IContext context) 
    { 
     var siteProvider = context.Kernel.Get<ISiteProvider>(); // use a provider to find which site is being used 
     switch (siteProvider.Current) 
     { 
      case "Site1": 
       return new DbContext1(); // or use a factory to create 
      case "Site2": 
       return new DbContext2(); 
     } 
    } 
} 

:この場合、あなたはカップルのオプションがあり

Bind<DbContext>().ToProvider<DbContextProvider>().InRequestScope(); 

2)条件付きバインディングを

When()修飾子が持っています異なる州のための過負荷の束、またはあなたはcあなたがたくさん使っているタイプが1つあれば、拡張メソッドを返す。

 Bind<DbContext>().To<DbContext1>() 
      .When(request => request.ParentContext.Kernel.Get<ISiteProvider>().Current == "Site1") 
      .InRequestScope(); 

     Bind<DbContext>().To<DbContext2>() 
      .When(request => request.ParentContext.Kernel.Get<ISiteProvider>().Current == "Site2") 
      .InRequestScope(); 

これは、このバインディングが適用される条件がいくつかある場合に適しています。あなたのロジックがこれ以上複雑になったら、プロバイダに行く。また、条件付きバインディングはパフォーマンスの低下を招くことに注意してください。最も単純な結合ロジックについて

バインディング

3)ToMethod()、毎回結合が解決されNinjectはいくつかのコードを実行することができます:基本的に

Bind<DbContext>().ToMethod(context => 
      context.Kernel.Get<ISiteProvider>().GetSite()); 

、あなたが選択したオプションに依存しますどのインスタンスをアクティブにするかを決定する際にどのくらいの論理が関与しているか。

https://github.com/ninject/Ninject/wiki/Providers%2C-Factory-Methods-and-the-Activation-Context

:ここ
context.Kernel.Get<DbContext2>(); 

は、アクティベーションプロセスのいくつかの公式ドキュメントです:各インスタンスでは、あなたはどちらかnew()アップインスタンス、またはあなたがインスタンスを解決することが可能なのiKernelにアクセスすることができます
+0

オプション1が動作しました –

関連する問題