C#回顾学习笔记四十:三层架构

1)三层框架是什么?
按照书籍和博客文章里千篇一律的解释就是:UI层、BLL层、DAL层。这样的解释通常无法让人一时半会理解含义,总而言之在这里先大概说明一下三层架构。正如其他文章提到的一样,三层架构就是:表示层(与用户直接进行交互)、业务逻辑层(在表示层和数据访问层中间联系两者的重要角色)、数据访问层(与数据库实打实的做交易,存取数据之类的)。所谓UI层实际上就是跟用户打交道的那一层,比如控制台应用程序、asp.net web应用程序、窗体应用程序,这些项目文件都是用于跟用户打交道的,所以就是UI层。

2)为什么使用三层框架?
假设有一个窗体应用程序,比如新建了一个winform窗体应用。用户单击注册按钮后,将各种数据提交到后台,此时你可以直接调用ExecuteNonQuery()方法并将用户数据写入数据库。而三层架构的特点就是将用户注册的业务提交给了BLL层,再由BLL层提交给DAL层处理问题,这样用户的注册业务就经过了好几步才完成。为什么要这么麻烦?
有这么一家饭馆,由于刚起步所以只有厨师来管理整个饭馆。他们兼顾给客人点菜、做菜、上桌的事情。日子渐渐过去,饭馆规模将要扩充,这时候考虑雇佣服务员来为客人点单并将菜单交给厨房处理。增加服务员后,客人不会直接与厨师说要什么菜,因为客人变多意味着厨师变忙,而厨师变忙乱或许还会影响正在做的菜。所以客人就可以将菜单交给服务员,而服务员又将菜单交给厨房做菜,等厨房菜做好之后,服务员又将菜交给相应的客人。这样做的好处在于:①让复杂的工作变得有秩序。②其中任意一个环节出了问题,能够更加迅速发现并快速维护。③分工合作使得每个人的工作量变得固定,更加人性化。
代码的分层能让不同职员负责不同的层,通过分层能将业务细节分解,将不同功能的代码分散出来。这样做更加有利于系统的开发,业务越大可能分的层也越多,都是为了让系统便于维护和扩展。从另一方面讲,分工合作的优势就是让适合的人做自己擅长的事情,使得平均劳动时间变短,让效率变高。 软件的分层实际上就是实现“高内聚、低耦合”。就以上面的【用户单击注册按钮】的例子来讲,所有的包括业务逻辑、数据库操作用到的方法甚至sql语句都存在一个Form1类里面,这就必须使得做这个项目的人不但要会业务逻辑,还要懂数据库操作。如果分为三层来操作,那么UI层的编码人员不需要懂sql语句,它只要知道调用一个别人写好的方法就可以获得自己需要的东西就可以了,这样结构更加清晰,分工更明确。

3)如何使用三层架构?
以一个从数据库查询表并返回到窗体上的例子来解释,只要清楚了这个查询怎么实现,其他的增删改查也用同样的套路完成。
第1步,本次实验使用SQLserver。先设计好数据库,新建表Student并添加一些记录,表字段如下:


第2步,新建Model类库文件,虽然Models不在三层架构的概念说明里(UL、BLL、DAL),但却是开发必要的。Models提供实体类,贯穿整个项目,三层都需要用到它。在解决方案上右键-添加-新建项目-类库,名字叫Student.Model。在类库文件下新建实体类,名字是Students.cs,为了节省篇幅这里使用自动属性,代码如下:
public class Students  
    {  
        public string Address { get; set; }  
        public int? Weight { get; set; }  
        public int? Tall { get; set; }  
        public string Gender { get; set; }  
        public string Birthday { get; set; }  
        public string Name { get; set; }  
        public int Id { get; set; }  
    }
第3步,按照添加Model类库文件的做法添加一个DAL类库文件,名字叫Student.DAL。因为上面提到过实体类贯穿三层,因此DAL层要添加对Model的引用,在。在类库文件下新建SQLHelper类用于实现数据库操作,新建StudentDAL类用于接收来自BLL层的增删改查处理。
第4步,新建类库文件(DAL层),取名叫Student.DAL,上面提到过实体类贯穿整个项目,因此DAL层要添加对Student.Model的引用。在“引用”上右键-添加引用-解决方案,找到Student.Model并勾选确定。然后在DAL类库文件下新建StudentDAL类和SqlHelper类。StudentDAL类主要提供业务处理需要用到的方法,比如查询表,比如根据Id查找用户,比如删除用户等等……这里只提供查询表的方法。SqlHelper类主要是对数据库实际进行查询操作需要用到的方法。详细代码如下
StudentDAL类代码(注意先using Student.Model;):
public class StudentDAL
    {
        public DataTable Select()
        {
            DataTable table = SqlHelper.ExecuteQuery("select * from Student");
            return table;
        }
    }
SqlHelper类代码:
class SqlHelper
    {
        private static readonly string connStr = ConfigurationManager.ConnectionStrings["testConn"].ConnectionString;
        
        public static SqlConnection createConnection()
        {
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            return conn;
        }


        //执行查询:select返回多行多列
        public static DataTable ExecuteQuery(SqlConnection conn, string sql, params SqlParameter[] parameters)
        {
            DataTable table = new DataTable();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = sql;
                cmd.Parameters.AddRange(parameters);
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    table.Load(reader);
                }
            }
            return table;//返回加载的表
        }


        public static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = createConnection())
            {
                return ExecuteQuery(conn, sql, parameters);
            }
        }
    }
注意:SqlHelper类中的ExecuteQuery()方法构成重载,主要是方便DAL层调用这个方法时少传入一个SQLConnection对象的参数,这些都在SqlHelper类内部进行处理并自动调用真正实现查询操作的方法来处理数据了。
第5步,新建类库文件(BLL层),取名叫Student.BLL。BLL层需要将任务提交给DAL层处理,并且上面提到过实体类贯穿整个项目,因此BLL层要添加对DAL层和Model的引用,参照上面的方式,添加对Student.DAL和Student.Model的引用。在BLL类库文件下新建StudentBLL类,详细代码如下
StudentBLL类的代码(注意先using Student.Model;和using Student.DAL;):
public class StudentBLL
    {
        private StudentDAL sDal = new StudentDAL();
        public DataTable Select()
        {
            return sDal.Select();
        }
    }
第6步,新建winform窗体应用,这表示UI层。假设名字叫Student.Winform。先using Student.BLL;,然后在窗体上添加一个DataGridView控件,图片如下:


第7步,在Student.Winform窗体应用程序下的App.config里配置数据库连接字符串,在 <configuration>标签里配置如下代码:
<connectionStrings>
    <add name="testConn" connectionString="server=.;database=CRUDTest;uid=sa;pwd=145217"/>
  </connectionStrings>
其中name属性的值与DAL层下SqlHelper类中的ConnectionStrings["testConn"]保持一致。server表示数据库地址,小数点代表本地地址。database表示数据库名字。uid是数据库登录用户名。pwd是数据库登录密码。
接着添加窗体应用程序的代码,主要添加一个Load事件,详细代码如下:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            StudentBLL bll = new StudentBLL();
            DataTable table = bll.Select();
            dataGridView1.DataSource = table;
        }
    }
第8步,将Student.Winform设为启动项并运行程序,如果能观察到运行结果则说明没有问题。

4)对上面代码执行过程做解释
1.运行窗体程序会自动执行Load事件的代码,先声明StudentBLL类的对象,然后就可以调用BLL层的Select()方法。
2.BLL层会先声明StudentDAL类的对象,然后继续调用DAL层的Select()方法。BLL层并不实现查询操作,只是将这个任务交给DAL层处理了。
3.DAL层的Select()方法会调用SqlHelper类的ExecuteQuery()方法。在SqlHelper类内部又会先调用写好的获得一个SQLConnection对象的方法,并调用构成重载的另一个ExecuteQuery()方法。
4.构成重载的这个ExecuteQuery()是具体实现数据库操作的方法,查询到表结果后逐步返回到DAL层的Select()方法里。
5.DAL层的Select()方法已经获得调用ExecuteQuery()方法返回的表结果,并将这个表结果返回到调用它的BLL层里。BLL层又将表结果返回到调用BLL层的UI层里。
6.UI层里执行dataGridView1.DataSource = table;用于将表数据填充到控件上显示。至此完成表数据查询操作。

5)三层架构的概念补充
1.参照上面对三层架构的讲解与练习,实际上可以用一张图片来解释上面的运行过程。理解三层架构的含义后,甚至用这张图解释上面提到的餐馆例子也可以。UI层相当于客户,BLL层相当于服务员,而DAL层相当于厨师。

2.有代码生成器可以自动生成三层架构的项目,甚至连数据库增删改查方法都提供了。比如“动软代码生成器”,当然不要太依赖软件的“自动”。

3.或许在做了上面三层架构的练习后,会觉得BLL层的功能微乎其微。实际上在BLL层可以进行逻辑判断,这也正是BLL层的好处所在。比如BLL层拿到DAL层返回过来的数据后,可以进行相应的if判断,确保数据满足业务需求,再返回给UI层。

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值