从codeproject里发现了一个非常不错的.net动态代理类库,有一个很好的特点是不仅支持接口代理,还支持非接口代理,关键是开源的。而castle是否开源就不太清楚了。
以下是我在事务处理中的应用。
以下是我在事务处理中的应用。
- public class DbTransactionProxy : IInterceptor
- {
- Object target = null;
- private DbTransactionProxy(Object target)
- {
- this.target = target;
- }
- public static T NewInstance<T>(Object target)
- {
- return new ProxyFactory().CreateProxy<T>(new DbTransactionProxy(target));
- }
- #region IInterceptor 成员
- object IInterceptor.Intercept(InvocationInfo info)
- {
- Object[] attrs = info.TargetMethod.GetCustomAttributes(typeof(TransactionAttribute), true);
- object ret = null;
- if (attrs != null && attrs.Length > 0)
- {
- TransactionAttribute trans = (TransactionAttribute)attrs[0];
- if (trans.IsTransaction)
- {
- //开始事务处理
- try
- {
- SessinoUtil.BeginTransaction(trans.ConnectionString);
- ret = info.TargetMethod.Invoke(target, info.Arguments);
- SessinoUtil.CommitTransaction(trans.ConnectionString);
- }
- catch(Exception ex)
- {
- SessinoUtil.RollbackTransaction(trans.ConnectionString);
- }
- }
- }
- else
- {
- ret = info.TargetMethod.Invoke(target, info.Arguments);
- }
- return ret;
- }
- #endregion
- }
public class DbTransactionProxy : IInterceptor
{
Object target = null;
private DbTransactionProxy(Object target)
{
this.target = target;
}
public static T NewInstance<T>(Object target)
{
return new ProxyFactory().CreateProxy<T>(new DbTransactionProxy(target));
}
#region IInterceptor 成员
object IInterceptor.Intercept(InvocationInfo info)
{
Object[] attrs = info.TargetMethod.GetCustomAttributes(typeof(TransactionAttribute), true);
object ret = null;
if (attrs != null && attrs.Length > 0)
{
TransactionAttribute trans = (TransactionAttribute)attrs[0];
if (trans.IsTransaction)
{
//开始事务处理
try
{
SessinoUtil.BeginTransaction(trans.ConnectionString);
ret = info.TargetMethod.Invoke(target, info.Arguments);
SessinoUtil.CommitTransaction(trans.ConnectionString);
}
catch(Exception ex)
{
SessinoUtil.RollbackTransaction(trans.ConnectionString);
}
}
}
else
{
ret = info.TargetMethod.Invoke(target, info.Arguments);
}
return ret;
}
#endregion
}
类似的,可以实现AOP缓存一类的应用,这里不多述