-Mô hình 3 lớp hay còn được gọi là mô hình Three Layer3-Layer, mô hình này ra đời nhằm phân chia các thành phần trong hệ thống, các thành phần cùng chức năng sẽ được nhóm lại với nhau và
Trang 1ĐẠI HỌC QUỐC GIA TP HCM
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
Trang 2BẢNG PHÂN CÔNG THỰC HIỆN
Họ tên : Lưu Lê Bá
Trang 3Mục lục
1 Mô hình 3 lớp là gì……… 4
2 Các thành phần của mô hình 3 lớp……… … 4
2.1 Presentation Layer……… 6
2.2 Business Logic Layer……… 6
2.3 Data Access Layer……… ….7
3 Cách hoạt động……… … 8
4 Ưu điểm và nhược điểm………… ……… …….9
5 So sánh mô hình 3 lớp và MVC……… ……10
6 Phân biệt 3-tier và 3-layer 10
7 Demo 12
Trang 4-Mô hình 3 lớp hay còn được gọi là mô hình Three Layer(3-Layer), mô hình này ra đời nhằm phân chia các thành phần trong hệ thống, các thành phần cùng chức năng sẽ được nhóm lại với nhau và phân chia công việc cho từng nhóm để dữ liệu không bị chồng chéo
– Presentation Layer (GUI) : Lớp này có nhiệm vụ chính giao tiếp với người dùng Nó
gồm các thành phần giao diện ( win form, web form,…) và thực hiện các công việc như nhập liệu, hiển thị dữ liêu, kiểm tra tính đúng đắn dữ liệu trước khi gọi lớp Business LogicLayer (BLL)
Trang 5 Đây là nơi đáp ứng các yêu cầu thao tác dữ liệu của GUI layer, xử lý chính nguồn dữ liệu từ Presentation Layer trước khi truyền xuống Data Access Layer
và lưu xuống hệ quản trị CSDL
tính toán và xử lý các yêu cầu nghiệp vụ, trước khi trả kết quả về Presentation Layer
– Data Access Layer (DAL) : Lớp này có chức năng giao tiếp với hệ quản trị CSDL như
thực hiện các công việc liên quan đến lưu trữ và truy vấn dữ liệu ( tìm kiếm, thêm, xóa, sửa,…)
Three-layer architecture
Trang 6Có hai thành phần chính sau đây với những tác vụ cụ thể :
Chúng chịu trách nhiệm thu nhận và hiển thị dữ liệu cho người dùng…
chuyển đổi giữa các UI…
2.2 Bussiness Layer (BLL) :
Lớp này gồm 4 thành phần:
lớp Presentation sử dụng
nghiệp vụ gồm nhiều bước và kéo dài Những quy trình này phải được sắp xếp
và thực hiện theo một thứ tự chính xác
ràng buộc logic và thực hiện các công việc Các thành phần này cũng thực hiện
Trang 7 Bussiness Entities : thường được sử dụng như Data Transfer Objects
( DTO ) Bạn có thể sử dụng để truyền dữ liệu giữa các lớp (Presentation và Data Layer) Chúng thường là cấu trúc dữ liệu ( DataSets, XML,… ) hay các lớpđối tượng đã được tùy chỉnh
2.3 Data Layer (DAL) :
DAL có chức năng chính là ghi lại các dữ liệu quan trọng Vì thế mô hình có 2 phần là:
tạo thuận lợi cho việc dễ cấu hình và bảo trì
cách dễ dàng và đơn giản
Kinh nghiê ̣m khi xây dựng mô hình 3 lớp là bạn cần thành lâ ̣p một solution riêng cho project Trong đó có 3 project khác nhau để tạo 3 lớp Thực hiê ̣n đă ̣t tên Project cần có cáctiền tố theo mẫu Tên lớp_Tên tê ̣p (Ví dụ: GUI_Quản lý)
Tuy nhiên, để đảm bảo sự thống nhất bạn nên đă ̣t tên theo nguyên tắc Dưới đây là mô ̣t số cách đặt tên cho các thành phần của 3 lớp, Ví dụ:
Mô ̣t là, đă ̣t lần lượt tên GUI - BUS - DAL
Hai là, sử dụng tên có chứa tiền tố GUI - BLL - DAL - DTO
Ba là, áp dụng tên có chứa GUI - BLL - DAL
3 Cách hoạt động
Trang 81 tiến trình giao tiếp từ GUI đến Data Acess Layer:
- Người sử dụng tác động lên GUI yêu cầu hiển thị thông tin lên màn hình Tại đây GUI
sẽ kiểm tra yêu cầu của người dùng nhập có hợp lệ hay không, nếu không hợp lệ sẽ thông báo cho người dùng
- Ngược lại yêu cầu sẽ được gởi trực tiếp đến BLL hoặc thông qua lớp object DTO hỗ trợ luân chuyển , tại đây BLL sẽ xử lý nghiệp vụ về yêu cầu của người dùng, nếu yêu cầu không hợp lệ hoặc tự xử lý yêu cầu không cần phải truy vấn thì BLL sẽ gởi thông tin về GUI và GUI sẽ hiển thị kết quả cho người dùng
- Trong trường hợp BLL cần thao tác trên dữ liệu từ CSDL thì BLL sẽ gởi yêu cầu đến trực tiếp đến DAL hoặc thông qua DTO , nhờ DAL giao tiếp với hệ quản trị CSDL lấy hoặc thêm, xóa, sửa dữ liệu
- DAL sẽ giao tiếp hệ quản trị CSDL với các truy vấn (sử dụng công nghệ ADO, LINQ to SQL, NHibernate, Entity Framework)
Tại đây tiếp tục thực hiện tiến trình thứ 2 được biểu diễn bằng các mũi tên màu xanh:
Trang 9- Sau khi DAL thực hiện giao tiếp, hệ quản trị CSDL sẽ trả kết quả truy vấn về DAL , DAL sẽ gởi thông tin về dữ liệu vừa lấy trực tiếp sang BLL hoặc thông qua DTO xử lý tiếp nghiệp vụ với yêu cầu đã gởi từ trước, sau khi xử lý xong nghiệp vụ, BLL sẽ gởi thông tin đến GUI , GUI sẽ hiển thị thông báo và kết quả yêu cầu lên màn hình.
VD: Mô tả hoạt động của mô hình 3-layer với ứng dụng liệt kê danh sách điểm sinh viên:
Từ màn hình form quản lý sinh viên gồm có 1 combobox chọn lớp, 1 gridview để hiển thị danh sách sinh viên và 1 button để thực hiện lệnh liệt kê danh sách
- Người dùng chọn combobox lớp trên GUI và ấn button liệt kê
- GUI kiểm tra yêu cầu chọn combobox hợp lệ và gởi mã lớp (**) vừa chọn sang BUS xử
lý yêu cầu hiển thị danh sách điểm sinh viên
- Tại BUS vì yêu cầu từ GUI khá đơn giản nên BUS sẽ không xử lý gì mà sẽ gởi mã lớp sang DAL lấy danh sách điểm
- Tại DAL sau khi đã nhận được yêu cầu lấy danh sách điểm từ mã lớp, DAL sẽ tương tác với hệ quản trị CSDL qua các lệnh mở tập tin, kết nối, truy vấn,… để lấy được danh sách điểm với mã số yêu cầu, DAL tiếp tục gởi danh sách (**) này sang BUS để xử lý
- Tại BUS sau khi nhận được danh sách điểm từ DAL gởi sang, BUS thực hiện nghiệp vụ của mình bằng cách tính điểm trung bình, kết luận đậu/rớt của từng sinh viên (tất cả xử lý
về mặt nghiệp vụ), sau đó gởi danh sách điểm đã xử lý (**) sang GUI để hiển thị
- 1 lần nữa GUI có thể kiểm tra tính hợp lệ của dữ liệu và hiển thị thông tin và thông báo lên màn hình cho người dùng
Một số câu kinh nghiệm khi sử dụng:
- Các thao tác trên control như: kiểm tra nhập hợp lệ, ẩn hiện các control, và các xử lý thông tin trên control thì ta đặt các hàm xử lý ngay trên GUI
- Các thao tác trên các dữ liệu cơ bản như: List, Array List, Object, DataTable, string, int, long, float,… ta xử lý ngay chính tầng nghiệp vụ BUS, vì bản chất khi thay đổi hệ quản trịhay các platform thì BUS không thay đổi
- Các thao tác với CSDL như truy vấn, kết nối, đóng kết nối,… ta xử lý trong DAL
- Khi có nhu cầu thay đổi hệ quản trị CSDL, ta chỉ cần thay đổi DAL phù hợp với hệ quản trị mới, giữ nguyên BUS, GUI và build lại project
- Khi có nhu cầu chuyển đổi qua lại giữa ứng dụng web forms hoặc win forms ta chỉ cần thay GUI, giữ nguyên DAL,BUS và build lại project
Trang 104 Ưu điểm và nhược điểm của mô hình 3 lớp
Đây là mô hình được các nhà lâ ̣p trình tin học tin dùng bởi sở hữu nhiều ưu điểm như:
Việc phân chia thành từng lớp với các nhiệm vụ khác nhau sẽ mang lại hiê ̣u quả quản lý tường minh Khi chúng đảm nhận các chức năng riêng biệt khác nhau sẽ giảm sự kết dính
Những người có kinh nghiê ̣m lâ ̣p trình thường áp dụng trong kiểm soát giao diện, xử lý, truy vấn, Hạn chế tối đa viê ̣c để tất cả lại một chỗ nhằm quản lý và maintain project tối
ưu hơn
Dễ dàng phân loại các hành động tại Business sẽ góp công lớn trong công tác bảo trì Khi được phân chia thành từng nhóm, lâ ̣p trình viên có thể nhanh chóng thay đổi khi cần bảo trì một thành phần của hệ thống
Với mô hình 3 lớp , thao tác thay đổi dữ liê ̣u có thể được cô lập trong 1 lớp hoặc chỉ ảnh hưởng đến lớp gần nhất Điều đó đảm bảo không ảnh hưởng đến cả chương trình, tiết kiê ̣m thời gian công sức
Thao tác phân loại các hàm truy xuất tại Database hay phân loại hàm theo table,… Chúng
sẽ trở nên dễ dàng vì chúng ta đã có chuẩn để tuân theo
Nhờ có mô hình thì viê ̣c muốn thêm một chức năng nào đó sẽ dễ dàng hơn
Khi có sự thay đổi giữa hai môi trường từ Winform sang Webform Và bạn mong muốn tái
sử dụng thì chỉ việc thay đổi lớp GUI
Nếu mọi người đều tuân theo một quy chuẩn đã được định sẵn, thì khi bàn giao công viê ̣c trở nê dễ dàng và tiết kiê ̣m thời gian Các thành viên có thể tương tác thuận tiện
Mô hình quản lý 3 lớp sẽ hỗ trợ phân phối nhiệm vụ, khối lượng công việc rõ ràng Đồng thời, nó sẽ giúp các lập trình viên kiểm soát công tác
Với những ưu điểm tuyê ̣t vời, mô hình cho phéo áp dụng được cho nhiều project lớn ở bênngoài
Trang 11 Điểm giống nhau:
o Cả hai đều là mô hình kiến trúc áp dụng trong lập trình được tách thành 3 thành phần
o Tách biệt sự phụ thuộc giữa ngôn ngữ lập trình, môi trường phát triển, xử lý logic
o Các thành phần ở mỗi mô hình có nhiều điểm tương đồng như Presentation Layer và View
Điểm khác biệt:
o Khác biệt rõ nhất là cách xử lý yêu cầu (workflow) của 2 mô hình
o 3 Layer thường được sử dụng trong lập trình ứng dụng, trong khi đó MVC được ưu chuộng nhiều trong lập trình website vì tính linh hoạt và không bắt buộc các DTO như 3-Layer
Trang 12Một số mô hình tương tự: MVC, MVP,MVVM,…
6 Phân biệt 3-tier và 3-layer
1-tier, 3-layer
Trang 13 2-tier, 3-layer
3-tier, 3-layer
Trang 14Mặc dù cấu trúc phân chia giống nhau (presentation, bussiness , data) Tuy nhiên chúnghoàn toàn khác nhau Nếu 3 tiers có tính vật lí thì 3 layer có tính logic Nghĩa là ta phânchia ứng dụng thành các phần (các lớp) theo chức năng hoặc vai trò một cách logic Cáclayer khác nhau được thực thi trong 1 phân vùng bộ nhớ của process Vì thế nên một tier
có thể có nhiều layer
- Khi dùng từ layer, chúng ta nói tới việc phân chia ứng dụng thành các thành phần mộtcách logic theo chức năng hoặc theo vai trò, điều này giúp phần mềm của bạn có cấu trúcsáng sủa, dễ dùng lại, từ đó giúp việc phát triển và bảo trì dễ dàng hơn Các layer khácnhau khi được thực thi vẫn có thể nằm trong cùng một vùng bộ nhớ của một process, vàhiển nhiên việc giao tiếp giữa 2 layer có thể không phải là giao tiếp giữa 2 process, đồngnghĩa với việc chúng không liên quan tới mô hình client/server
- Trái lại, tier liên quan đến cách phân chia một cách vật lý các thành phần trên các máytính khác nhau Điều làm nhiều người nhầm lẫn giữa layer và tier là chúng có cùng cáchphân chia (presentation, business, data), tuy nhiên trên thực tế chúng khác nhau Vì cáchphân chia như trên nên 1 tier có thể chứa nhiều hơn 1 layer
7 Demo
Như các bạn đã nhìn tại sơ đồ ở trang 1 thì Mô hình 3 lớp hoạt động như sau:
GUI liên kết tới dc Business Layer và DTO.
Trang 15Bây giờ chúng ta bắt đầu tạo, đối với 3 Project DTO, Business và Data Access chúng ta
tạo theo Class Library
Và khi tạo xong, ta sẽ có 4 project như sau
Trang 16Và bây giờ chúng ta sẽ liên kết, làm project GUI trước nhé Đầu tiên ta chọn chuột fải
vào References => Add Reference
Một cái bảng hiện ra, tại mục Project ta sẽ chọn 2 lớp mà lớp GUI có thể liên kết tới
là BUS và DTO:
Trang 17Cứ OK là Reference sẽ được thêm vào GUI, chúng ta có thể kiểm tra bằng cách
mở References ra:
Làm tương tự đối với BUS và DAL theo bên trên.
Thế là đã liên kết xong cho mô hình 3 lớp
Trang 18CSDL sẽ xài table ThanhVien như sau:
CREATE TABLE THANHVIEN (
TV_ID INT NOT NULL PRIMARY KEY IDENTITY,
TV_NAME NVARCHAR(30) NOT NULL,
TV_PHONE VARCHAR(11) NOT NULL,
TV_EMAIL VARCHAR(50) NOT NULL
)
Xây dựng DTO
Mình sẽ tạo file DTO_ThanhVien.cs (Class file), về cơ bản thì các cột của
table ThanhVien của mình ra sao thì mình tạo 1 class y hệt vậy kèm get/set
private int _THANHVIEN_ID;
private string _THANHVIEN_NAME;
private string _THANHVIEN_PHONE;
private string _THANHVIEN_EMAIL;
Trang 19public string THANHVIEN_NAME
Trang 20this.THANHVIEN_ID = id;
this.THANHVIEN_EMAIL = email;
this.THANHVIEN_NAME = name;
this.THANHVIEN_PHONE = phone;
}
}
}
C# – Mô hình 3 lớp đơn giản – Xây dựng mô hình 3 lớp: Xây dựng Data Access
Tại sao mình lại xây dựng Data Access trước? Đơn giản là đây là lớp mà ta xử lý bên database, làm trước thì design GUI xong chỉ việc bỏ vào sử dụng thôi
Điều quan trọng đầu tiên, chúng ta cần tạo class DBConnect.cs với nội dung như sau:
}
}
Chúng ta sẽ tạo SqlConnection và khởi tạo luôn, sau này các class DAL ta chỉ cần kế thừa class DBConnect là có thể sử dụng _conn không cần khởi tạo lại.
Phải sửa lại connection string chuẩn
Ta sẽ tạo file DAL_ThanhVien.cs (Class file)
Ở đây mình sẽ làm sẵn luôn 4 methods là: Lấy tất cả, Thêm, Xóa, Sửa
Trang 21DataTable dtThanhvien = new DataTable();
da.Fill(dtThanhvien);
string SQL = string.Format("INSERT INTO
THANHVIEN(TV_NAME, TV_PHONE, TV_EMAIL) VALUES ('{0}', '{1}', '{2}')", tv.THANHVIEN_NAME, tv.THANHVIEN_PHONE, tv.THANHVIEN_EMAIL);
// Command (mặc định command type = text nên chúng
ta khỏi fải làm gì nhiều)
SqlCommand cmd = new SqlCommand(SQL, _conn);
// Query và kiểm tra
Trang 22// Dong ket noi
tv.THANHVIEN_ID);
// Command (mặc định command type = text nên chúng
ta khỏi fải làm gì nhiều)
SqlCommand cmd = new SqlCommand(SQL, _conn);
// Query và kiểm tra
Trang 23// Command (mặc định command type = text nên chúng
ta khỏi fải làm gì nhiều)
SqlCommand cmd = new SqlCommand(SQL, _conn);
// Query và kiểm tra
Trang 24Bước này là bước xử lý business logic (Business layer).
Ở bước này, ta có thể lấy dữ liệu từ DAL về, xử lý ABC XYZ gì đó rồi trả về lại cho GUI sử dụng Hoặc khi update dữ liệu trên DB, GUI gửi data lên BUS và rồi ta xử
lý ABC XYZ gì đó cho data của chúng ta, rồi mới insert/update/delete chẳng hạn,…
Vì app mình build là app đơn giản, nên mình chỉ cần gọi lên DAL và trả về tương ứng
cho GUI xài thui
Mình sẽ tạo BUS_ThanhVien.cs (Class file):
DAL_ThanhVien dalThanhVien = new DAL_ThanhVien();
public DataTable getThanhVien()
Trang 25}
}
}
C# – Mô hình 3 lớp đơn giản – Xây dựng mô hình 3 lớp: Xây dựng GUI
Về GUI thì sẽ design như sau
Và sẽ gán lần lượt các chức năng vào
Trang 26DTO_ThanhVien tv = new DTO_ThanhVien(0,
txtName.Text, txtSDT.Text, txtEmail.Text); // Vì ID tự tăng nên để ID số gì cũng dc
// Them
if (busTV.themThanhVien(tv))
{
MessageBox.Show("Thêm thành công");
dgvTV.DataSource = busTV.getThanhVien(); // refresh datagridview
Trang 27// Lấy row hiện tại
DataGridViewRow row = dgvTV.SelectedRows[0]; int ID =
Convert.ToInt16(row.Cells[0].Value.ToString());
// Tạo DTo
DTO_ThanhVien tv = new DTO_ThanhVien(ID, txtName.Text, txtSDT.Text, txtEmail.Text); // Vì ID tự tăng nên để ID số gì cũng dc
// Sửa
if (busTV.suaThanhVien(tv))
{
MessageBox.Show("Sửa thành công");
dgvTV.DataSource = busTV.getThanhVien(); // refresh datagridview
Trang 28private void dgvTV_Click(object sender, EventArgs e)
{
// Lấy row hiện tại
DataGridViewRow row = dgvTV.SelectedRows[0];
// Chuyển giá trị lên form
txtName.Text = row.Cells[1].Value.ToString();
txtSDT.Text = row.Cells[2].Value.ToString();
txtEmail.Text = row.Cells[3].Value.ToString();
// Lấy row hiện tại
DataGridViewRow row = dgvTV.SelectedRows[0];
int ID = Convert.ToInt16(row.Cells[0].Value.ToString());
// Xóa
if (busTV.xoaThanhVien(ID))
{
MessageBox.Show("Xóa thành công");
dgvTV.DataSource = busTV.getThanhVien(); // refresh datagridview
Trang 29Kết thúc
Video cụ thể :