由简单三层到工厂模式

以ASP.NET为例,简单三层就是 DAL, BLL,Model 三层构成, DAL层处理数据,负责与数据打交道,比如SQL语句的书写等,DAL层处理完数据后的结果,交由BLL层,BLL层这时对数据进行逻辑整理。具体如下详细说明:

 

现有一个简单的需求,一个订单里可能包含几个产品,这时,我们一般这样处理,把订单写在主表,把具体的详细商品写在订单详细表,详细表中有一个主表的ID,用于关联二表。当用户下单提交时,处理如下:

 

两个表设为 主表Orders, 副表 OrderItem

 

DAL层:写SQL语句,分别写两个方法,一个是插入主表的方法,另一个是插入副表的方法。

 

插入主表Orders

public long Add(ModelOrder model)
{
          ……
}

插入副表OrderItem,语句这里略掉,这里只说明思路,不做真实的数据。

public long Add(ModelOrderItem model)
{
          ……
}

这两个方法,首先执行第一个返回的ID,然后第二个方法要用到这个返回的ID,那么这个逻辑处理就在BLL层里来处理了,这样写:

//插入主表后返回的ID
long id = DAL.Add(model);
//如果执行成功,说明ID>0
if(id>0)
{
	DAL.Add(model);
}


这个方法执行完,再返回到页面层级结果。

 

注意:其实上面的业务层处理严格的说写的不正确,为什么呢?设想我们插入主表成功了,但返回ID后,插入副表的时候,出错了,没有插入,那么就会造成数据库里只保存了订单信息,但没有订单详情信息。如何解决呢?自然我们会想到了事务,一旦出现上述情况,使用事务时,数据库会回滚,就是第二步出错了,那么第一步也会撤消。


using (SqlTransaction transaction = connection.BeginTransaction()){}

当然,这就个就要写在DAL层里了,在DAL层里把各个的添加方法写好了,然后在写一个方法,这个方法就是把各个方法加到事务中去,如果有一条语句执行时出错,则事务回滚,等于没有操作。

 

这基本上是一个简单三层的形象的最简单的介绍,那么简单三层有时候不能满足我们需要,比如说,你是一家软件公司,那么你开发了一个软件,用的SQLServer,而刚好碰到一个客户需要使用oracle,或是mysql,怎么办?当然,你也可以改,但是改的东西多了,最起码整个数据层都要被你扒了一遍了,而有一种方法基本不用怎么修改就可以达到需求,那就是工厂模式。

 

简单介绍:使用工厂模式,面向接口的编程,把数据层和业务层使用接口来交接,面向接口,不面向具体的实现,只要操作接口,实现变了也无所谓。


首先我们还是定义SQLServerDAL,BLL,Model三层,这次我们把DAL与BLL不直接进行交互了,中间插入一个IDAL接口层,这个接口负责与BLL通信,

BLL通过工厂反射等创建接口IDAL,


private readonly IOrderAction dal = DAOrder.CreateOrderAction();

SQLServerDAL只需实现IDAL即可,

public partial class Orders:IOrders

如果某一天你想换数据库,只需加相应的接口实现即可。

比如添加一个OracelServerDAL等

或是你提前把全部的数据层写好SQLServerDAL,OracelServerDAL,MySqlServerDAL……要哪个用哪个

当然,工厂模式带来的好处也绝不仅仅是上述这点功劳。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章