2

私の ASP.Net MVC アプリケーションは、実行時に複数のデータベースに接続する必要があります。以下に示すように、クラスをオーバーロードして、実行時に接続文字列を受け入れることができます

class MyClassDBContext:DbContext
{
  public MyClassDBContext(string str) : base(str)
  {
    this.Database.Connection.ConnectionString = str;
  }
}

現在、この接続文字列をデータベース テーブルから取得しています。私のワークフローは次のとおりです

  1. Web サイトは、web.config に保存されている資格情報を使用して既定のデータベースに接続します
  2. Web サイトは既定のデータベースにクエリを実行して、他のデータベースの接続文字列を取得します。
  3. Web サイトは、実行時に接続文字列を指定して他のデータベースに接続します

私が今直面している問題は、コードをきれいに保つことです。データベース番号 2 の接続文字列が必要になるたびに、既定のデータベースで検索する必要があります。これを行うためのよりクリーンな方法はありますか?接続文字列をプロファイル データに保存することを検討しましたが、これが良いアイデアかどうかはわかりません。私の Web サイトのすべてのユーザーは、資格情報に応じて、最大 2 ~ 3 つの異なるデータベースに接続する必要があります。

4

2 に答える 2

2

個人的には、すべての接続文字列を App.Config ファイルに入れ、単純な IOC 実装を使用します。

実際、Nuget の ninject パッケージは、ニーズに最適な場合があります。

これが私の言いたいことです。うまくいけば、これでコードがきれいになります。以前のプロジェクトでこれとまったく同じパターンを使用したところ、うまくいきました。

さらに一歩進んで Service Locator を作成し、global.asax にサービスを登録することもできます。興味があるかどうか教えてください。ninjectもチェックしてください。

public interface IService() 
{ 
  string GetConnectionString(); 
  void DoStuff(); 
}

public class DBServiceOne : DbContext, IService
{
  protected string GetConnectionString() 
  {
    return ConfigurationManager.AppSettings["DBServiceOneConnectionString"]
  }

  public DBServiceOne(string str) : base(str)
  {
     this.Database.Connection.ConnectionString = GetConnectionString()
  }

   public void DoStuff() { //logic goes here }
}

public class DBServiceTwo : DbContext, IService
{

    public DBServiceTwo(string str) : base(str)
    {
      this.Database.Connection.ConnectionString = GetConnectionString();
    }


    protected string GetConnectionString() 
    {
      return ConfigurationManager.AppSettings["DBServiceTwoConnectionString"]
    }

    public void DoStuff() { //logic goes here }
}

public class DBServiceThree : DbContext, IService
{

   public DBServiceThree(string str) : base(str)
   {
     this.Database.Connection.ConnectionString = GetConnectionString();
   }

   protected string GetConnectionString() 
   {
     return ConfigurationManager.AppSettings["DBServiceThreeConnectionString"]
   }

   public void DoStuff() { //logic goes here }
}

実装のために-コントローラーでコンストラクターインジェクションを使用します

//This could be in your home controller

public class HomeController : AsyncController
{
    private IService DBOneService;
    private IService DBTwoService;
    private IService DBThreeService;

   public HomeController(IService one, IService two, IService three)
   {
      DBOneService= one;
      DBTwoService = two;
      DBThreeService = three;
   }

  public HomeController() : this(new DBServiceOne(), new DBServiceTwo(), new DBServiceThree()) {}

public ActionResult Index() {
   DBOneService.DoStuff(); //here you'd want to return a list of data and serialize down with json or populate your razor template with it. Hope this helps!

}
于 2012-07-23T19:04:43.500 に答える
0

少し違う問題がありました。接続する DB は、製品のインポートの状態によって異なります。インポート中、データベースはアタッチおよびデタッチされます。現在利用可能なデータベースは「デフォルト データベース」に格納されます。

私が抱えていた主な問題は、接続プールをオフにする必要があったことです。そうしないと、データベースをデタッチして再度アタッチした後に無効な接続状態が存在していました。

これはあなたにとって問題ではないかもしれません。

それとは別に、現在の接続文字列をアプリケーションの状態に保存します。60秒ごとに、「デフォルトデータベース」に再度クエリを実行します。ロックを使用して、マルチスレッドの問題に注意する必要があります。

于 2012-07-23T19:58:43.253 に答える