现在的位置: 首页 > 综合 > 正文

大学大学,大概学学 之 Linq对DAL的影响

2012年12月13日 ⁄ 综合 ⁄ 共 1992字 ⁄ 字号 评论关闭

PetShop4的结构是UI、BLL、DAL。DAL将针对Item、Product、Category、Order等表的select、insert等操作分别封装在对应类内,BLL以接口引用工厂生成的具体DAL对象,并且获取UI传来的与数据库交互相关的参数以parameter的形式传给这些对象,完成数据库操作。(以接口引用的好处是可以无视DAL的具体实现,降低耦合)

PetShop4的DAL没有使用ORM,因此代码中用了大量const string保存SQL语句和各种parameters。考虑ORM,利用LINQ to SQL实现,把数据表拖进设计器,然后生成代码。用泛型实现DAL可以将Item、Product、Category、Order等类浓缩成一个DB<T>类,DB<T>类部分代码如下: 

1: public class DB<T>:IDAL.IDB<T> where T:class
2: {
3: private static DataContext dt;
4: public DB()
5: {
6: dt =new Model.BookStoreLinqDataContext(cnString);
7: }
8:
9: /// <summary>
10: /// 获得表
11: /// </summary>
12: /// <returns></returns>
13: public Table<T> GetTable()
14: {
15: return dt.GetTable<T>();
16: }
17:
18: /// <summary>
19: /// 条件查询
20: /// </summary>
21: /// <param name="selectExpression"></param>
22: /// <returns></returns>
23: public IEnumerable<T> Select(Func<T, bool> selectExpression)
24: {
25: return GetTable().Where<T>(selectExpression);
26: }
27:
28: /// <summary>
29: /// 单个实体添加
30: /// </summary>
31: /// <param name="newEntity"></param>
32: public void Add(T newEntity)
33: {
34: GetTable().InsertOnSubmit(newEntity);
35: Submit();
36: }
37:
38: /// <summary>
39: /// 单个实体更新
40: /// </summary>
41: /// <param name="entity"></param>
42: /// <param name="updater"></param>
43: public void Update(T oldentity, Action<T> update)
44: {
45: update(oldentity);
46: Submit();
47: }
48:
49: /// <summary>
50: /// 单个实体删除
51: /// </summary>
52: /// <param name="deleteEntity"></param>
53: public void Delete(T deleteEntity)
54: {
55: GetTable().DeleteOnSubmit(deleteEntity);
56: Submit();
57: }
58: //...
59: //其他方法,略
60: }

在BLL中通过Factory利用反射动态创建具体DLL对象,并将业务逻辑需要的数据库操作以lambda表达式的形式传给DAL对象,完成数据库操作。例如:

//BLL中

DB<Model.Users> db=new DB<Model.Users>();

private static IEnumerable<Users> datasource;       //User是实体类

 

 

//接受UI传来的参数,比如TextBox1.Text赋给id

//对id作逻辑处理

 

datasource = db.Select(user => user.ID == id);

 

//对datasource 作逻辑处理

//返回datasource 给UI

原来的架构下,SQL语句都包含在DAL中,现在利用Linq使得查询语句(Lambda表达式)出现在了BLL,是否违背了三层架构的思想呢,我感觉没有,因为对数据库操作的真正实现还是在DAL中,lambda表达式算是业务逻辑的一部分,就像原架构BLL中要传递的parameters一样。

新架构下,BLL依然分Item、Product、Category、Order等类封装业务逻辑,而DLL中的Item、Product、Category、Order等类则变为DB<T>类一个,代码看起来更清晰,不会被大量string搞乱。
个人学习笔记(向学长学习),欢迎拍砖 :)

抱歉!评论已关闭.