[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class TransactionAttribute : ContextAttribute, IContributeObjectSink
{
public TransactionAttribute() : base("Transaction") { }
public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink next)
=> new TransactionAop(next); // 注入攔截器
}
ContextAttribute(已實作 IContextProperty)。IContributeObjectSink.GetObjectSink 回傳 TransactionAop 串接至訊息鏈。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public sealed class TransactionMethodAttribute : Attribute
{
public TransactionMethodAttribute() { }
}
[Transaction]
public class UserInfoAction : SqlDAL
{
[TransactionMethod]
public void Add(UserInfo user) { ... }
}
類別標記 [Transaction] 註入攔截器,方法標記 [TransactionMethod] 指定哪些方法需交易。發現類別層級 Attribute 會被實例化,方法層級不會,故需雙重標記確保攔截器啟用。