-
C#
用
Attribute
< br>实现
AOP
事务
[C# | AOP | Attribute |
ContextAttribute
|
IContributeObjectSink | IMessageSink ]
前言
使用
Attribute
来实现方法级
别事务一直是我的梦想,
浅谈
Attribute [C# |
Attribute |
DefaultValueAttribute]
有体现我的无奈,
Attribute
确实是真真
切切的非侵入式的东西
(
其实
我是想侵
入的
: ) )
,前有
DUDU
的
Attribute
在
.net
编程中的应用系列文章,但是总是离想象
和需求有
那么点出入,
通过三天的努力,
Google
< br>的陪伴,
下面和大家一起分享我这三天的成果
用
Attribute
实现
AOP
事务
吧!
致谢文章
1.
Aspect-Oriented Programming Enables
Better Code Encapsulation and
Reuse
关键性的
CallContext
是在这里发现的。
2.
C# Attribute
在
.net
编程中的应用
(
转)
这篇文章原文地址找不到了,
DUDU
的
Attribute
在
.net
编程
中的应用系列文章就是这篇文章的分解,
他写到了五,
后面的大
家可以从
这篇文章里面提前看到了。
阅前注意
1.
整篇文章的核心和突破点在于上下文
Context
的使用,务必注意
CallContext
在整<
/p>
个程序中起到的作用
2.
本文中看到的
SqlHelper
使用
的是微软
。
3.
本文重点在于如何实现,并且已经测试通过,只贴关键性代码,所以请认
真阅读,部
分代码直接拷贝下来运行是会出错的
!
正文
首先我们来看一段未加事务的代码:
public
abstract
class
SqlDAL
{
#region
ConnectionString
private
SqlConnectionStringBuilder _ConnectionString =
null
;
///
///
字符串连接
///
public
virtual
SqlConnectionStringBuilder ConnectionString
{
get
{
if
(_ConnectionString ==
null
||
string
.IsNullOrEmpty
(_tionString))
{
_ConnectionString =
new
SqlC
onnectionStringBuilde
r(VER_CONNECTION_S
TRING);
}
return
_ConnectionString;
}
set
{ _ConnectionString =
value; }
}
#endregion
#region
ExecuteNonQuery
public
int
ExecuteNonQuery(
string
cmdText)
{
return
eNonQuery(t
ionString, , cmdText);
}
public
int
ExecuteNonQuery(
string
cmdText, CommandType type)
{
return
eNonQuery(t
ionString, type, cmdText);
}
public
int
ExecuteNonQuery(
string
cmdText, CommandType typ
e,
params
SqlParameter[]
cmdParameters)
{
return
eNonQuery(t
ionString, type, cmdText,
cmdParameters);
}
#endregion
代码说明:
1.
本类对
进一步封装。
2. VER_CONNECTION_STRING
替换成自己的连接字
符串就行了。
public
class
UserInfoAction :
SqlDAL
{
///
///
添加用户
///
public
void
Add(UserInfo user)
{
StringBuilder sb =
new
StringBuilder();
(
);
(rd);
(
);
();
ExecuteNonQuery(sql);
}
}
如果我们要加入事务,
通常的办法就是在方法内
try
、
ca
tch
然后
Commit
、
Rollback
,缺
点就不说了,下面我会边贴
代码边讲解,力图大家也能掌握这种方法
: )
先贴前面两个被我修改的类
public
abstract
class
SqlDAL :
ContextBoundObject
{
private
SqlTransaction _SqlTrans;
///
///
仅支持有事务时操作
///
public
SqlTransaction SqlTrans
{
get
{
if
(_SqlTrans ==
null
)
{
//
从上下文中试图取得事务
object
obj =
a(TransactionAop.C
ontextName);
if
(obj !=
null
&& obj
is
SqlTransaction)
_SqlTrans = obj
as
SqlTransaction;
}
return
_SqlTrans;
}
set
{ _SqlTrans = value; }
}
#region
ConnectionString
private
SqlConnectionStringBuilder _ConnectionString =
null
;
///
///
字符串连接
///
public
virtual
SqlConnectionStringBuilder ConnectionString
{
get
{
if
(_ConnectionString ==
null
||
string
.IsNullOrEmpty
(_tionString))
{
_ConnectionString =
new
SqlC
onnectionStringBuilde
r(VER_CONNECTION_S
TRING);
}
return
_ConnectionString;
}
set
{ _ConnectionString =
value; }
}
#endregion
#region
ExecuteNonQuery
public
int
ExecuteNonQuery(
string
cmdText)
{
if
(SqlTrans ==
null
)
return
eNonQuery(
nectionString, , cmdText);
else
return
eNonQuery(SqlTrans,
CommandTyp
, cmdText);
}
public
int
ExecuteNonQuery(
string
cmdText, CommandType type)
{
if
(SqlTrans ==
null
)
return
eNonQuery(
nectionString, type,
cmdText);
else
return
eNonQuery(SqlTrans,
type, cmdT
ext);
}
public
int
ExecuteNonQuery(
string
cmdText, CommandType typ
e,
params
SqlParameter[]
cmdParameters)
{
if
(SqlTrans ==
null
)
return
eNonQuery(
nectionString, type, cmdText,
cmdParameters);
else
return
eNonQuery(SqlTrans,
type, cmdT
ext, cmdParameters);
}
#endregion
}
代码说明
:
1.
加了一个属性
(Property)SqlTr
ans
,并且每个
ExecuteNonQuery
执行前都加
了判断是否以事务方式执行。这样做是为后面从上下文中取事务
做准备。
2.
类继承了
ContextBoundObject
,
注意,是必须的,
MSDN
是这样描述的:定
< br>义所有上下文绑定类的基类。
3. TransactionAop
将在后面给出。
[Transaction]
public
class
UserInfoAction :
SqlDAL
{
[TransactionMethod]
public
void
Add(UserInfo user)
{
StringBuilder sb =
new
StringBuilder();
(
);
(rd);
(
);
();
ExecuteNonQuery(sql);
}
}
代码说明:
1.
很简洁、
非侵入式、
很少改动、
非常方便
(
想要事务就加
2
个标记,
不想要就去掉
)
。
2.
两个
Attribute
后面将给出。
-
-
-
-
-
-
-
-
-
上一篇:男士英文名大全
下一篇:C# 操作Access数据库的参考实例