Castle实践4-Automatic Transaction Management Facility
Posted on 2005-06-26 02:40 绿叶 阅读(5414) 评论(12) 编辑 收藏 举报
在进入第五节的NHibernate Facility之前,先介绍Automatic Transaction Management Facility,它是一个用于自动化管理事务的Facility,根据执行的方法是否抛出异常来决定“提交”或者“回滚”事务。
Automatic Transaction Management Facility很简单,是辅助性质的Facility。它通过特性来使用的。使用的两个特性都是上一节所介绍的Castle.Services.Transaction中的,分别是:
1)TransactionalAttribute:用于类,表明使用自动事务管理的。
2)TransactionAttribute:用于方法,指定方法使用的事务模式和隔离级别。
以下是使用方法:
这个Facility一般和其他的Facility一起使用。容器会对声明了TransactionAttribute的方法注入一个拦截器(Interceptor),拦截器依赖于一个ITransactionManager。
它使用ITransactionManager来产生一个事务trans,然后在调用trans.Begin()之后执行方法处理,最后根据方法是否发生异常来trans.Commit()或者trans.Rollback(),最后是调用ITransactionManager.Dispose(trans)来释放资源。这样它就完成了事务自动化过程。
需要注意的是:如果你在容器注册使用自动事务管理的组件不是以一个接口来注册的,那么在需要自动事务管理的方法必须声明为:virtual。为什么这样做?你需要了解动态代理的实现机制:http://www.zeroport.net/default.aspx/Repository.DynamicProxy
Automatic Transaction Management Facility很简单,是辅助性质的Facility。它通过特性来使用的。使用的两个特性都是上一节所介绍的Castle.Services.Transaction中的,分别是:
1)TransactionalAttribute:用于类,表明使用自动事务管理的。
2)TransactionAttribute:用于方法,指定方法使用的事务模式和隔离级别。
以下是使用方法:
WindsorContainer container = new WindsorContainer(store);
container.AddFacility( "auto.transaction", new TransactionFacility() );
container.AddFacility( "auto.transaction", new TransactionFacility() );
[Transactional]
public class BusinessClass
{
public void Load(int id)
{

}
[Transaction(TransactionMode.Requires)]
public '''virtual''' void Save(Data data)
{

}
}
public class BusinessClass
{
public void Load(int id)
{

}
[Transaction(TransactionMode.Requires)]
public '''virtual''' void Save(Data data)
{

}
}
这个Facility一般和其他的Facility一起使用。容器会对声明了TransactionAttribute的方法注入一个拦截器(Interceptor),拦截器依赖于一个ITransactionManager。
它使用ITransactionManager来产生一个事务trans,然后在调用trans.Begin()之后执行方法处理,最后根据方法是否发生异常来trans.Commit()或者trans.Rollback(),最后是调用ITransactionManager.Dispose(trans)来释放资源。这样它就完成了事务自动化过程。
需要注意的是:如果你在容器注册使用自动事务管理的组件不是以一个接口来注册的,那么在需要自动事务管理的方法必须声明为:virtual。为什么这样做?你需要了解动态代理的实现机制:http://www.zeroport.net/default.aspx/Repository.DynamicProxy
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构