1

このトランザクションをコードで管理する良い方法が何であるかはわかりません。

私は次のものを持っているとしましょう

サービス層 (非静的クラス) リポジトリ層 (静的クラス)

// サービス層クラス

/// <summary>
/// Accept offer to stay
/// </summary>
public bool TxnTest()
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        SqlTransaction txn = conn.BeginTransaction();

        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.Transaction = txn;

            try
            {
                DoThis(cmd);
                DoThat(cmd);

                txn.Commit();
            }
            catch (SqlException sqlError)
            {
                txn.Rollback();
            }
        }
    }
}

// レポクラス

   /// <summary>
    /// Update Rebill Date
    /// </summary>
    public static void DoThis(SqlCommand cmd)
    {
        cmd.Parameters.Clear();
        cmd.Parameters.AddWithValue("@SomeParam", 1);

        cmd.CommandText = "Select * from sometable1";
        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }



 /// <summary>
        /// Update Rebill Date
        /// </summary>
        public static void DoThat(SqlCommand cmd)
        {
            cmd.Parameters.Clear();
            cmd.Parameters.AddWithValue("@SomeParam", 2);

            cmd.CommandText = "Select * from sometable2";
            cmd.CommandType = CommandType.Text;
            cmd.ExecuteNonQuery();
        }
  1. 上記のアプローチは良いですか?リポジトリに静的クラスを使用するのは賢明ですか、それとも問題を引き起こしますか?
  2. コマンド (cmd) オブジェクトを渡すことなくこれを行う方法はありますか?
4

1 に答える 1

3

Unit of work pattern を参照してください。

作業単位パターンは、それが示唆するもの、つまり一度にコミットされる作業単位、またはまったくコミットされない作業単位を正確に定義します。

これは、次の 2 つの部分を持つインターフェイスを定義することによって発生します。

  • 挿入、更新、削除操作を処理するメソッド (これらの操作をすべて公開する必要はなく、1 つのエンティティ タイプに限定されないことに注意してください)
  • コミットするメソッド (ロールバックする場合は、単純に commit を呼び出さないでください)。これは、変更するために登録されたすべてのエンティティの挿入、更新、および/または削除と同様に、トランザクションを処理する場所です。

次に、このインターフェースの実装を渡し、すべての操作が完了したら、外側の境界 (サービス) で変更をコミットします。

LINQ-to-Entities のObjectContextクラスと LINQ-to-SQL のDataContextクラスはどちらも作業単位の例であることに注意してください(操作を実行し、それらをバッチで保存します)。

于 2012-09-26T19:26:19.477 に答える