20241006_tran

public abstract class BaseForm : Form
{
    protected IStatusUpdateStrategy statusUpdateStrategy; // ステータス更新用のストラテジー
    protected ILockStrategy lockStrategy; // ロック管理用のストラテジー
    protected IHoldStrategy holdStrategy; // 保留管理用のストラテジー
    protected SqlConnection connection; // DB接続用のコネクション

    public BaseForm(IStatusUpdateStrategy statusStrategy, ILockStrategy lockStrategy, IHoldStrategy holdStrategy, SqlConnection connection)
    {
        this.statusUpdateStrategy = statusStrategy;
        this.lockStrategy = lockStrategy;
        this.holdStrategy = holdStrategy;
        this.connection = connection;

        // ロック処理を実行
        lockStrategy.LockData(GetTrayCode());
    }

    // トランザクションを用いた共通のデータ登録フロー
    protected void RegisterData(string trayCode, FinancialData data)
    {
        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                // 1. 財務データの登録
                SaveFinancialData(trayCode, data, transaction);

                // 2. ステータス更新処理
                statusUpdateStrategy.UpdateStatus(trayCode, GetCurrentUserName(), transaction);

                // 3. ロック解除処理
                lockStrategy.UnlockData(trayCode, transaction);

                // すべての操作が成功したらコミット
                transaction.Commit();
            }
            catch (Exception ex)
            {
                // 失敗時にはロールバック
                transaction.Rollback();
                throw; // エラーの再スロー
            }
        }
    }

    // 財務データを保存する抽象メソッド(具象クラスで実装)
    protected abstract void SaveFinancialData(string trayCode, FinancialData data, SqlTransaction transaction);

    // トレイコードを取得する(具象クラスで実装可能)
    protected virtual string GetTrayCode()
    {
        return "TRAY001"; // 仮のトレイコードを返す
    }

    // 現在のユーザー名を取得する
    protected string GetCurrentUserName()
    {
        return "UserA"; // 仮のユーザー名を返す
    }

    // フォームが閉じられるときにロック解除する処理
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        lockStrategy.UnlockData(GetTrayCode());
    }
}

いいなと思ったら応援しよう!