2

この質問で MARC Gravells の提案に従ってください

私は今、私のコードでこのようなものを数回繰り返しています:

using (var conn = CreateConnection())
using (var dataCommand = conn.CreateCommand()) 
{
        conn.Open();
        [...]                        
} 

以下はファクトリメソッドで正しいCreateConnection()ですか? それとも、エラーが発生しやすくなりますか? using(注:ディレクティブからのみ呼び出すつもりです)

SqlConnection CreateConnection()
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
    return conn;
}

それとも、このメソッドを修正して、そのOpen中にも含めるケースはありますか?

4

2 に答える 2

5

あなたのコードは静的ファクトリメソッドの典型的な例です。

ファクトリパターンはソフトウェアデザインパターンの一部であり、ソフトウェアデザインの特定のコンテキスト内で一般的に発生する問題に対する一般的な再利用可能なソリューションです。デザインパターンを理解するための非常に優れたスターターブックであるHeadFirstDesignPatternsを読むことをお勧めします。

コードに関するいくつかの提案:

  1. ファクトリメソッドを静的にします。インスタンス変数などは使用しません。
  2. 関連はありませんが、ファクトリメソッドでローカル変数を使用する必要はありません。接続を直接返すことができます。

これで、メソッドは次のようになります。

static SqlConnection CreateConnection(){
    return new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
}

SqlConnectionのコンストラクターを呼び出す前に、ConnectionStrings["IMS"]がnullかどうかを確認することをお勧めします。このクラスは接続を開始しないため、これ以上のエラー処理は必要ありません。

開いている接続を返し、同じメソッドで接続エラーを処理するとします。

static SqlConnection CreateConnection()
{

    if (ConfigurationManager.ConnectionStrings["IMS"] == null)
    {
        throw new Exception("Connection string not found in the configuration file.");
    }
    var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["IMS"].ConnectionString);
    try
    {
        sqlConnection.Open();
    }
    catch (Exception exception)
    {
        throw new Exception("An error occured while connecting to the database. See innerException for details.", exception);
    }
    return sqlConnection;
}

必要に応じて、後でこれらの例外を処理するための独自の例外クラスを作成できます。ASPMVCN層の例外処理を参照してください。例外が発生した場合にnullを返すこともできますが、最初に「 nullを返すのは悪いデザインですか?」をチェックしてください。

于 2012-08-05T15:21:36.923 に答える
2

ファクトリとシングルトン:

私の怒り。訂正大歓迎!!

機能的には、開発者がファクトリ パターンを理解する方法に断絶が見られました。簡単に言えば、工場は製品を提供するつもりであり、提供すべきです。(例: "Car Factory" がある場合、"Car" が表示されます)。

そうは言っても、インスタンス化ロジックを公開したくない場合にのみファクトリ パターンを実装し、さまざまな具体的な製品を作成する必要があります。あなたの場合、必要が常にSQLオブジェクト(製品の一種)である場合、なぜFactoryですか? 拡張性とスケーラビリティについて議論することはできますが、それは主観的なものです。ほとんどの企業は、長い間 SQL サーバーまたは Oracle のいずれかを使用しており、製品に組み込まれたスケーラビリティを使用することはありません。

  1. シングルトン パターン(または) 静的メンバーを使用したさらに単純なクラスをうまく使用できると思います。
  2. もう 1 つの重要なメソッドは、CloseConnection() メソッドです。元のコードでusingは、オブジェクトを kill して破棄する which を使用しましたが、新しい静的実装では、それをビルドすることができます。
    public static void CloseConnection(SQLConnection conn)
    {
        if (conn.State == ConnectionState.Open)
        {
           conn.Close();
           conn.Dispose();
        }
    }

于 2012-08-10T16:08:10.850 に答える