2017-08-14 1 views
0

私はC#クラスライブラリが接続文字列を受け入れて静的変数に格納するシングルトンアプローチを使用しています。この変数は別のクラスで使用され、特定のタスクを実行します。このプロセスは現在まで問題なく動作していますが、Windowsコンシューマアプリケーションでは、このクラスのN個のインスタンスを作成しなければならず、各インスタンスは別のデータベースで同時に動作する必要があります。インスタンスの賢明な接続文字列

明らかに静的アプローチは機能しなくなるため、静的変数を削除しました。クラスからクラスへの接続文字列を渡す以外のベストプラクティスは何ですか?また、Properties.Settings.Defaultを使用して接続文字列を保存しようとしましたが、新しいインスタンスが作成されるたびに既存の文字列を上書きします。私のプロジェクト全体(小けれども)の

プロトタイプを以下に示します:

私はその仕事受け入れ、名前空間内の他のクラスへの接続文字列を利用できるようにすることですクラスのConnectionStringを、持っています。

internal class ConnectionString 
      { 
       private string _connectionstring { get; set; } 
       public ConnectionString(string connectionstring) 
       { 
        _connectionstring = connectionstring; 

        //WHERE TO STORE THIS STRING FOR METHODS OF OTHER CLASSES TO CONSUME???? 

       } 
      } 

次に、データベースに対して特定の操作を実行する操作クラスがあります。

internal class Operations 
      { 
       public void Operation1() 
       { 

        using (var conn = new SqlConnection()) 
        { 
         //Some operation 
        } 
       } 

       public void Operation2() 
       { 
        using (var conn = new SqlConnection()) 
        { 
         //Some other operation 
        } 

       } 

       public void Operation3() 
       { 
        using (var conn = new SqlConnection()) 
        { 
         //Some other operation 
        } 

       }  
      } 

私のWindowsアプリケーションが消費したいライブラリによって公開されているクラスは、Baseというタイトルです。これは、上記のクラスを消費して全体のタスクを実行します。

public class Base 
    { 
     public Base(string connectionstring) 
     { 
      var ConnInstance = new ConnectionString(connectionstring); 
      var OpInstance = new Operations(); 

      OpInstance.Operation1(); 
      OpInstance.Operation2(); 
      OpInstance.Operation3(); 

     } 
    } 

最後に、消費者アプリケーションは、同時に塩基のN個のインスタンスを作成し、接続文字列を渡す必要があります。

public partial class Form1 : Form 
     { 
      public Form1() 
      { 
       InitializeComponent(); 
      } 

      private void Form1_Load(object sender, EventArgs e) 
      { 
       var ins1 = new Base("Data Source=(local);Initial Catalog=DATABASE1; Integrated Security=SSPI;"); 
       var ins2 = new Base("Data Source=(local);Initial Catalog=DATABASE2; Integrated Security=SSPI;"); 
       var ins3 = new Base("Data Source=(local);Initial Catalog=DATABASE3; Integrated Security=SSPI;"); 
       var ins4 = new Base("Data Source=(local);Initial Catalog=DATABASE4; Integrated Security=SSPI;"); 
       var ins5 = new Base("Data Source=(local);Initial Catalog=DATABASE5; Integrated Security=SSPI;"); 

      } 
     } 

ヘルプのあらゆる種類のために事前にありがとうございます。関連する「オペレーション」と

+0

'Base'でそのオブジェクトを作成するときに' Operations'に接続文字列を渡すだけの理由はありますか?それからあなたはベースコンストラクタに渡された接続文字列を持っていて、正しいことをしますか?これは非常に明白なので、これは不可能な理由があるはずです。 – Chris

+0

Chris、実際のプログラムははるかに大きく、実際のプログラムのプロトタイプを指定しました。私がオペレーションクラスに似た15〜20の異なるクラスを持っているとしたら、これらのクラスのそれぞれに接続文字列を渡したくないとします。 – Arjmand

+0

これらのクラスに接続文字列を渡さない理由は何ですか?彼らは使用する接続文字列を知る必要があるので、必要な接続を識別するために*何かを渡す必要があります。なぜ接続文字列自体ではないのですか? – Chris

答えて

1

あなたのデータベースアクセス層は、UI /フォームの懸念を意識する必要はありません。同様に、UIフォームは接続文字列またはデータベース接続キャッシュを実装する必要はありません。

接続文字列のキャッシングを担当する中間接続ファクトリクラスと、オプションで特定のUIフォームからの接続要求を調停できるファクトリが必要になることをお勧めします。次に、フォームインスタンスからファクトリクラスへのアクセスを設計するだけです。

あなたのアプリケーションのロジックとデータベース接続の作成の間にあまりにも多くの間接参照を作成しているのだろうかと思います。データベース接続で最も重要な設計目標は、ローカルスコープで短期間であることです。つまり、多くのusing(var db = new Connection)ディスポーザルの例に従います。 .Netランタイムは、通常、直接接続を超えたdb接続のキャッシュを保持します。その結果、データベース接続の作成にはコストがかかりませんが、複数の分の期間にわたって特定のフォームインスタンスにリースするのはコストがかかります。

Azure DocumentDb APIは、db接続の作成に関する従来の知恵を変更します。上記の私の答えは、質問者がクラスSQLデータベースを使用していることを前提としています。

+0

迅速な対応をありがとうございます。私は懸念の分離を達成することができたと思う。私が直面しているより大きな問題は、各インスタンスの接続文字列をどこに邪魔することなく格納するかということです。 – Arjmand