首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Attribute 實現 AOP 事務(二):SqlDAL 封裝 SqlTransaction 上下文儲存、ExecuteNonQuery 依據事務存在性切換執行模式

     編輯:關於C語言

UserInfoAction 業務類別


public class UserInfoAction : SqlDAL
{
    public void Add(UserInfo user)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("UPDATE [UserInfo] SET Password='").Append(user.PassWord)
          .Append("' WHERE UID=").Append(user.UID);
        ExecuteNonQuery(sb.ToString());
    }
}

SqlDAL 基類改造


public abstract class SqlDAL : ContextBoundObject
{
    private SqlTransaction _sqlTrans;
    public SqlTransaction SqlTrans
    {
        get
        {
            if (_sqlTrans == null)
            {
                object obj = CallContext.GetData(TransactionAop.ContextName);
                if (obj != null && obj is SqlTransaction) _sqlTrans = (SqlTransaction)obj;
            }
            return _sqlTrans;
        }
        set { _sqlTrans = value; }
    }

    private SqlConnectionStringBuilder _connStr;
    public virtual SqlConnectionStringBuilder ConnectionString
    {
        get
        {
            if (_connStr == null || string.IsNullOrEmpty(_connStr.ConnectionString))
                _connStr = new SqlConnectionStringBuilder(Configurations.SQLSERVER_CONNECTION_STRING);
            return _connStr;
        }
        set { _connStr = value; }
    }

    public int ExecuteNonQuery(string cmdText)
        => SqlTrans == null ? SqlHelper.ExecuteNonQuery(ConnectionString.ConnectionString, CommandType.Text, cmdText)
                            : SqlHelper.ExecuteNonQuery(SqlTrans, CommandType.Text, cmdText);
    // 其它多載略...
}

關鍵點

  • 繼承 ContextBoundObject 使物件具備上下文邊界,支援 AOP 攔截。
  • SqlTrans 屬性從 CallContext 取得交易,實現跨層傳遞而不修改業務方法簽章。
  • ExecuteNonQuery 依 SqlTrans 是否為 null 決定使用交易或一般連線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved