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 決定使用交易或一般連線。