程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#用Attribute實現AOP事務(3)

C#用Attribute實現AOP事務(3)

編輯:關於C語言

代碼說明:

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()
        {
        }
    }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved