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