Lập trình C# – Mô hình 3 lớp trong C#

Khi bạn làm việc với các ứng dụng, nếu với những dự án nhỏ thì việc tạo một ứng dụng theo ý của chúng ta rất dễ dàng, tuy nhiên khi bạn làm với những dự án lớn hơn, cần nhiều người cùng làm hơn thì việc lập trình trở nên phức tạp hơn, vậy nên đễ dễ dàng hơn trong việc quản lý các thành phần của hệ thống cũng như ảnh hưởng tới các thành phần khác khi ta thay đổi một thành phần, chúng ta thường nhóm các thành phần có cùng chức năng lại với nhau. Chính vì thế các mô hình lập trình được sinh ra, một trong những mô hình lập trình đó là mô hình 3 lớp (3 – Layer).

 

Lập trình C# - Mô hình 3 lớp trong C#

 

1. Phân biệt tầng (Tier) và lớp (Layer)

 

Tầng cho chúng ta thấy sự tách biệt vật lý với nhau, những tầng này có thể nầm cùng một nơi hay các nơi khác nhau trên thực tế các ứng dụng lớn thì Database sẽ nằm ở một Server, các API hay Web Service nằm một Server khác và ứng dụng thì chạy ở Client.

 

Lập trình C# - Mô hình 3 lớp trong C#

 

Khác với tầng, lớp không thể hiện rõ sự tách biệt về mặt vật lý chúng thường nằm chung một nơi nhưng ở các namspace khác nhau.

 

Lập trình C# - Mô hình 3 lớp trong C#

 

2. Xây dựng demo

 

– dbConnection

 

Lớp này được sử dụng chủ yếu để thực hiện các thao tác update, delete và các truy vấn cơ sở dữ liệu. Nó cũng kiểm tra nếu kết nối cơ sở dữ liệu được mở hay không. Nếu kết nối  không mở (Close /Broken) thì sẽ mở lại. Các kết quả truy vấn cơ sở dữ liệu sẽ trả về table trong lớp này.
Thông tin kết nối cơ sở dữ liệu lấy từ file app.config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace ThreeLayer
{
    class dbConnection
    {
        private SqlDataAdapter myAdapter;
        private SqlConnection conn;
        public dbConnection()
        {
            conn = new SqlConnection(ConfigurationSettings.AppSettings["dbConnectionString"]);
        }
        private SqlConnection openConnection()
        {
            if (conn.State == ConnectionState.Closed || conn.State == ConnectionState.Broken)
            {
                conn.Open();
            }
            return conn;
        }
        public DataTable executeSelectQuery(String _query, SqlParameter[] sqlParameter)
        {
            SqlCommand myCommand = new SqlCommand();
            DataTable dataTable = new DataTable();
            myAdapter = new SqlDataAdapter();
            dataTable = null;
            DataSet ds = new DataSet();
            try
            {
                myCommand.Connection = openConnection();
                myCommand.CommandText = _query;
                myCommand.Parameters.AddRange(sqlParameter);
                myCommand.ExecuteNonQuery();               
                myAdapter.SelectCommand = myCommand;
                myAdapter.Fill(ds);
                dataTable = ds.Tables[0];
            }
            catch (SqlException e)
            {
                return null;
            }
            finally
            {
            }
            return dataTable;
        }
        public bool executeInsertQuery(String _query, SqlParameter[] sqlParameter)
        {
            SqlCommand myCommand = new SqlCommand();
            try
            {
                myCommand.Connection = openConnection();
                myCommand.CommandText = _query;
                myCommand.Parameters.AddRange(sqlParameter);
                myAdapter.InsertCommand = myCommand;
                myCommand.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                return false;
            }
            finally
            {
            }
            return true;
        }
        public bool executeUpdateQuery(String _query, SqlParameter[] sqlParameter)
        {
            SqlCommand myCommand = new SqlCommand();
            try
            {
                myCommand.Connection = openConnection();
                myCommand.CommandText = _query;
                myCommand.Parameters.AddRange(sqlParameter);
                myAdapter.UpdateCommand = myCommand;
                myCommand.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                return false;
            }
            finally
            {
            }
            return true;
        }
    }
}

 

Database Access Layer

 

Database Access Layer (DAO) xây dựng các truy vấn dựa vào các thông số từ Business Logic Layer và chuyển nó đến lớp DBConnection để thực hiện. Sau đó trả kết quả về Business Logic Layer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ThreeLayer.DAO
{
    class CustomerDAO
    {
        private dbConnection conn;
        public CustomerDAO()
        {
            conn = new dbConnection();
        }
        public DataTable getAllCus()
        {
            string query = string.Format("select * from [MD_Customer]");
            SqlParameter[] sqlParameters = new SqlParameter[0];
            return conn.executeSelectQuery(query, sqlParameters);
        }
        public DataTable searchById(int _id)
        {
string query = "select * from [MD_Customer] where CustomerId = @Cus_id";
            SqlParameter[] sqlParameters = new SqlParameter[1];
            sqlParameters[0] = new SqlParameter("@Cus_id", SqlDbType.Int);
            sqlParameters[0].Value =_id;
            return conn.executeSelectQuery(query, sqlParameters);
        }
    }
}

 

Value Object

 

Đây đơn giản là lớp trình bày các thuộc tính của đối tượng (Customer) nó cung cấp phương thức Post và Get, kết nối trực tiếp với Business Logic Layer và Presentation Layer. Như bạn có thể thấy trong sơ đồ giá trị của đối tượng được SET trong Business Logic Layer và GET ở Presentation Layer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ThreeLayer.VO
{
    class CustomerVO
    {
        private int _iCustomerId;
        private string _sCustomerName;
        private int _iAge;
        private string _sAddress;
        public CustomerVO()
        {
        }
        public int iCustomerId
        {
            get
            {
                return _iCustomerId;
            }
            set
            {
                _iCustomerId = value;
            }
        }
        public string sCustomerName
        {
            get
            {
                return _sCustomerName;
            }
            set
            {
                _sCustomerName = value;
            }
        }
        public int iAge
        {
            get
            {
                return _iAge;
            }
            set
            {
                _iAge = value;
            }
        }
        public string sAddress
        {
            get
            {
                return _sAddress;
            }
            set
            {
                _sAddress = value;
            }
        }
    }
}

 

Business Logic Layer

 

Business Logic Layer (BUS) hoạt động như một cầu nối giữa Presentation Layer và DAO. Tất cả thông tin mà người dùng nhập vào được truyền đến Business Logic Layer. Các kết quả nhận được từ DAO là các dòng dữ liệu trong bảng nhưng và BUS sẻ chuyển đổi chúng thành các đối tượng VO. Business Logic Layer (BUS) là lớp quan trọng nhất trong toàn bộ kiến trúc vì nó có chứa tất cả các logic của chương trình. Bất cứ khi nào người dùng muốn cập nhật các logic của chương trình chỉ cần cập nhật lớp này.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ThreeLayer.DAO;
using ThreeLayer.VO;
using System.Data;
namespace ThreeLayer.BUS
{
    class CustomerBUS
    {
        private CustomerDAO _customerDAO;
        public CustomerBUS()
        {
            _customerDAO = new CustomerDAO();
        }
        public CustomerVO getCusById(int _id)
        {
            CustomerVO customerVO = new CustomerVO();
            DataTable dataTable = new DataTable();
            dataTable = _customerDAO.searchById(_id);
            foreach (DataRow dr in dataTable.Rows)
            {
                customerVO.iCustomerId = Int32.Parse(dr["CustomerId"].ToString());
                customerVO.sCustomerName = dr["CustomerName"].ToString();
                customerVO.iAge = Int32.Parse(dr["Age"].ToString());
                customerVO.sAddress = dr["Address"].ToString();               
            }
            return customerVO;
        }
        public DataTable getAllCus()
        {
            CustomerVO customerVO = new CustomerVO();
            DataTable dataTable = new DataTable();
            dataTable = _customerDAO.getAllCus();
            return dataTable;
        }
    }
}

 

Presentation Layer

 

Presentation Layer là lớp tương tác với người sử dụng, lớp này được sử dụng chủ yếu để nhận dữ liệu của người sử dụng và truyền nó sang Business Logic Layer để thực hiện những thao tác sử lý, dữ liệu sau trả về từ Business Logic Layer được trình bày sao cho người dùng có thể hiểu được.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ThreeLayer.BUS;
using ThreeLayer.VO;
namespace ThreeLayer
{
    public partial class frmCustomer : Form
    {
        public frmCustomer()
        {
            InitializeComponent();
        }
        CustomerBUS _customerBUS = new CustomerBUS();
        private void btnLoadData_Click(object sender, EventArgs e)
        {
            grdCustomer.DataSource = _customerBUS.getAllCus();
        }
        private void btnSearch_Click(object sender, EventArgs e)
        {
            int id;
            bool isNumeric = int.TryParse(txtCusId.Text, out id);
            if (isNumeric)
            {
                CustomerVO cusResuilt = _customerBUS.getCusById(id);
            }
            
        }
    }
}

 

Như vậy là chúng ta đã hoàn thành xong việc tìm hiểu về mô hình 3 lớp trong ứng dụng C#, phân biệt 3 tầng và 3 lớp cũng như hiểu được các khái niệm và chức năng của mỗi lớp.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s