DataRabbit 轻量的数据访问框架(01) -- ITransactionAccesser
(完全限定类名:DataRabbit.ITransactionAccesser)
在DataRabbit 轻量的数据访问框架 --序 中,我们已经知道,所有的访问器接口都继承了ITransactionAccesser接口。ITransactionAccesser的含义在于:访问器对象即可以工作于一个事务(Transaction)上下文中,也可以在脱离事务的环境中工作。
public interface ITransactionAccesser
{
/// <summary>
/// InTransaction 访问器是否处于一个事务中。
/// </summary>
bool InTransaction { get; }
}
如果访问器对象在事务上下文中工作,则该访问器对象就是有状态的,并且该访问器对象的生命期将随着事务的结束而结束,也就是说,当关联的事务结束后,就不能再使用这个访问器对象了。
如果访问器对象工作于非事务环境,则该访问器对象就是无状态的,可以以Sinleton的模式来使用这个访问器对象,也就是说,只需要一个这样的访问器对象,就可以在任何时间任何地点来通过它对数据库进行非事务方式的访问。
所有的访问器对象都是通过入口点IDataAccesser接口来获取的,比如:
/// <summary>
/// GetOrmAccesser 获取访问目标表的ORM访问器。
/// </summary>
IOrmAccesser<EntityType> GetOrmAccesser<EntityType>(IDbTransaction trans);
这些获取方法都接收一个类型为IDbTransaction的参数,表示返回的访问器对象将要关联的事务。如果我们需要一个非事务型的访问器对象,那么这个参数传入null即可。IDataAccesser在实现时,将缓存非事务型的访问器对象,因为非事务型的访问器对象是无状态的,可以以 Singleton模式来使用。也就是说,如果我们多次都以null作为参数和相同的泛型参数来调用 IDataAccesser.GetOrmAccesser()方法,那么多次调用得到的结果都将是同一个非事务型的ORM访问器。
如果IDbTransaction参数传入非空值,则IDataAccesser.GetOrmAccesser()方法总是创建一个新的事务型访问器对象返回,当作为参数的事务结束时,返回的访问器对象的生命期也就结束了。
从上述的介绍,我们可能已经猜到,事实上也是这样 -- 所有的访问器如果存在状态的话,这个状态的表现形式就是访问器类含有一个非空的 IDbTransaction型的成员变量,除此之外,再没有其它任何东西能决定一个访问器对象是有状态的还是无状态的。
无论是ORM访问器、还是Relation访问器等等,只要继承了ITransactionAccesser接口,都符合上述的原则,所以在使用这些访问器的时候,要注意事务型访问器对象与非事务型访问器对象的区别。
原文出处:
http://www.cnblogs.com/zhuweisky/