代碼說明:
1.加了一個屬性(Property)SqlTrans,並且每個ExecuteNonQuery執行前都加了判斷是否以事務方式執行。這樣做是為後面從上下文中取事務做准備。
2.類繼承了ContextBoundObject,注意,是必須的,MSDN是這樣描述的:定義所有上下文綁定類的基類。
3.TransactionAop將在後面給出。
UserInfoAction.cs
[Transaction] public class UserInfoAction : SqlDAL { [TransactionMethod] public void Add(UserInfo user) { StringBuilder sb = new StringBuilder(); sb.Append("UPDATE [UserInfo] SET Password='"); sb.Append(user.PassWord); sb.Append("' WHERE UID="); sb.Append(user.UID); ExecuteNonQuery(sql); } }
代碼說明:
1.很簡潔、非侵入式、很少改動、非常方便(想要事務就加2個標記,不想要就去掉)。
2.兩個Attribute後面將給出。
/// <summary> /// 標注類某方法內所有數據庫操作加入事務控制 /// </summary> [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public sealed class TransactionAttribute : ContextAttribute, IContributeObjectSink { /// <summary> /// 標注類某方法內所有數據庫操作加入事務控制,請使用TransactionMethodAttribute同時標注 /// </summary> public TransactionAttribute() : base("Transaction") { } public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink next) { return new TransactionAop(next); } } /// <summary> /// 標示方法內所有數據庫操作加入事務控制 /// </summary> [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public sealed class TransactionMethodAttribute : Attribute { /// <summary> /// 標示方法內所有數據庫操作加入事務控制 /// </summary> public TransactionMethodAttribute() { } }