DataRabbit 轻量的ORM框架(17)-- 使用DataRabbit的最佳实践

DataRabbit 轻量的数据访问框架(12)-- 将DataRabbit融入架构 一文中介绍了如何将DataRabbit与三层架构结合起来,但是,在实际的项目中,每一层是如何使用DataRabbit的了?本文将展示作者在项目中使用DataRabbit的标准做法。

我们以CompanyUser表和MemberShip表为例说明如下:

比如我们有个虚构的业务流程(仅用于示例)如下:根据UserID找到对应的MemberShip记录,然后根据MemberShip记录的UserState项的值来决定是否要删除CompanyUser表对应的用户记录。

对于此业务逻辑,涉及到两个BEM类和一个BL类,首先来看两个BEM:MembershipBEM和CompanyUserBEM。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public class MembershipBEM
{
private TransactionScopetransactionScope;

public MembershipBEM(TransactionScopescope)
{
this .transactionScope = scope;
}

public MembershipGetOne( string userID)
{
IOrmAccesser
< Membership > accesser = this .transactionScope.NewOrmAccesser < Membership > ();

return accesser.GetOne( new Filter(Membership._UserID,userID));
}
}

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassCompanyUserBEM
{
privateTransactionScopetransactionScope;

publicCompanyUserBEM(TransactionScopescope)
{
this.transactionScope=scope;
}

publicvoidDelete(stringuserID)
{
IOrmAccesser
<CompanyUser>companyUserOrmAcceser=this.transactionScope.NewOrmAccesser<CompanyUser>();
companyUserOrmAcceser.Delete(
newFilter(CompanyUser._UserID,userID));
}

}

大家可以看到:

(1)所有的BEM类的构造函数都接收一个TransactionScope类型作为参数,并将其保存在成员变量中。

(2)所有的数据库访问器实例,都是由TransactionScope相应的New操作产生(如NewOrmAccesser()方法创建一个ORM访问器)

(3)所有的数据库操作由TransactionScope产生的访问器来进行(关于更多的访问器,可参考本系列前面的文章)。

ok,针对目标业务逻辑,BEM层的动作就这么多。BL层将会把相关的BEM操作整合成一个业务流

我们来看针对示例业务逻辑的BL实现:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public class CompanyUserBL
{
#region TransactionScopeFactory
private TransactionScopeFactorytransactionScopeFactory;
public TransactionScopeFactoryTransactionScopeFactory
{
set {transactionScopeFactory = value;}
}
#endregion

public void DeleteIfInvalidUser( string userID)
{
using (TransactionScopescope = this .transactionScopeFactory.NewTransactionScope( false ))
{
MembershipBEMmembershipBEM
= new MembershipBEM(scope);
Membershipmember
= membershipBEM.GetOne(userID);
if (member.State == UserState.Invalid)
{
CompanyUserBEMcompanyUserBEM
= new CompanyUserBEM(scope);
companyUserBEM.Delete(userID);
}
scope.Commit();
}
}
}

大家看到:

(1)所有的BL都有一个注入属性——TransactionScopeFactory,表明目标业务流程将针对哪个数据库进行操作。

(2)在一个业务流程中,所有的BEM使用同一个TransactionScope实例,如此,便可以在一个Transaction中将相应的所有的BEM操作封装为一个事务支持的业务流。

(3)要启用Transaction,只需要将TransactionScopeFactory的NewTransactionScope()方法传入的参数改为true即可,如:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using(TransactionScopescope=this.transactionScopeFactory.NewTransactionScope(true))

{

//。。。。。。

}

(4)无论是否启用了Transaction,离开using的最后一句一定是scope.Commit();用以提交操作。

以上便是使用DataRabbit结合3层架构的最佳实践做法(我所知道的:))。

最后,简单说一下TransactionScopeFactory,实际上,我们只需要为每个数据库配置一个TransactionScopeFactory实例即可,BL类可以公用这一个实例。比如,我使用Spring配置一个TransactionScopeFactory实例:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> < object name = " dataConfiguration " type = " DataRabbit.DataConfiguration,DataRabbit " >
< propertyname = " DataBaseType " value = " SqlServer " />
< propertyname = " DataBaseName " value = " MasterDb " />
< propertyname = " IP " value = " 192.168.0.2 " />
< propertyname = " User " value = " sa " />
< propertyname = " Password " value = " testpwd " />
</ object >

< object name = " transactionScopeFactory " type = " DataRabbit.Application.TransactionScopeFactory,DataRabbit.Application " init - method = " Initialize " >
< propertyname = " DataConfiguration " ref = " dataConfiguration " />
</ object >

示例的CompanyUserBL类的实例只需要注入该transactionScopeFactory即可。

转到:DataRabbit 轻量的数据访问框架 -- 序

1. 轻量、弱侵入性。比如,DataRabbit对你的数据库设计没有任何要求(而有的数据访问框架可能要求数据表必须有唯一主键)。 2. 约定优于配置。使用DataRabbit不需要任何配置,这使得DataRabbit更加易用。 3. 数据库类型无关性。统一的数据访问接口屏蔽了数据库类型的差异,目前版本的DataRabbit内置了对SqlServer和Oracle的支持,可以通过插件的方式来支持其它类型的数据库。 4. DataRabbit中的所有数据访问功能都是由各种访问器(如IOrmAccesser、IRelationAccesser、ITableAccesser、IDataSchemaAccesser、IEntityRelationLoader、ISPAccesser)来提供的。 5. 所有的访问器接口的引用都可以从DataRabbit的根(“Root”,或称入口点)获得,这个根就是TransactionScopeFactory。 6. 一个根(“Root”)实例就对应着一个数据库。也可以这么说,针对一个特定的数据库,我们的应用只需要维护一个Root即可。 7. DataRabbit提供的所有的访问器(如IOrmAccesser)都可以在两种环境中工作:事务环境和非事务环境。这是由所有的访问器都继承了的ITransactionAccesser这个接口体现出来的。 8. 任何一个访问器实例,如果在非事务环境中工作,那么它就是无状态的,DataRabbit将以Singleton的模式提供它的实例;如果访问器实例工作于事务环境中,那么它就是有状态的,并且它的生命期将随事务的结束而结束,DataRabbit以“Single Call”的模式提供它的实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值