Xây dựng mô hình 3 lớp – three layer trong ASP.Net

Chào mọi người, việc mà viết web ASP.Net theo mô hình 3 lớp không còn là mới tuy nhiên cách sử dụng nó không phải ai cũng có thể nắm được hết đặc biệt là các bạn sinh viên, do đó mình muốn chia sẻ cách xây dựng mô hình 3 lớp ( three layer ) trong ASP.Net cho các bạn tham khảo.

Theo mình thấy thì tài liệu trên mạng về sử dụng mô hình 3 lớp asp.net rất nhiều, tuy nhiên chỉ viết về lý thuyết và cảm giác những kiến thức đó vô cùng lan man và chúng ta gần như không ứng dụng được gì từ đó, bài giới thiệu hôm nay mình sẽ không đề cập nhiều về lý thuyết mà tiến vào thực hành luôn, mục đích sao bài hôm may các bạn có thể viết được một ứng dụng asp.net theo mô hình 3 lớp.
kien truc 3 lop
Bài demo mình sẽ làm dưới đây là viết một Web ASP.Net đơn giản thêm, xóa, sửa CSDL của bảng người dùng theo mô hình 3 layer. Đầu tiên sẽ mô tả CSDL trước cho các bạn được nắm. Mình có database “DemoBaLopBCDONLINE” trong đó có bảng NguoiDung (MaND, HoTen, TenDangNhap, MatKhau, GioiTinh, Email).

create database DemoBaLopBCDONLINE
go
use DemoBaLopBCDONLINE
go
create table NguoiDung(
	MaND varchar(10) not null,
	HoTen nvarchar(50) not null,
	TenDangNhap nvarchar(10) not null,
	MatKhau nvarchar(1000) not null,
	GioiTinh bit null,
	Email nvarchar(100),
	constraint pk_nguoidung primary key(MaND)
)
Xây dựng WEB ASP.Net theo mô hình 3 layer

Bạn mở Visual Studio lên tạo một website và thiết kế một giao diện bao gồm các control tương ứng với các trường trong CSDL phía trên.

thiet ke form mo hinh 3 layer

From Nhập Dữ Liệu

Sau đó bạn tạo trong thư mục App_Code của Website các class: dataprovider.cs, nguoidungcontrol.cs, nguoidungdao.cs, nguoidungdto.cs. Trong đó có lớp dataprovider chúng ta đã viết và sử dụng ở bài tạo lớp kết nối trong asp.net Trong mô hình 3 layer lớp này cũng đóng vai trò kết nối CSDL do đó không có gì thay đổi vẫn viết như thế. Ta bắt đầu đi viết từng Class một trong phần này bạn mở class nguoidungdto.cs và viết như sau:

public class nguoidungdto
{
    private string _mand;
    private string _hoten;
    private string _tendangnhap;
    private string _matkhau;
    private bool _gioitinh;
    private string _email;


    public string mahoa(string pass)
    {
        return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(pass.Trim(), "SHA1");
    }

    public string mand
    {
        get { return _mand; }
        set { _mand = value; }
    }

    public string hoten
    {
        get { return _hoten; }
        set { _hoten = value; }
    }

    public string tendangnhap
    {
        get { return _tendangnhap; }
        set { _tendangnhap = value; }
    }

    public string matkhau
    {
        get { return _matkhau; }
        set { _matkhau = value; }
    }

    public bool gioitinh
    {
        get { return _gioitinh; }
        set { _gioitinh = value; }
    }

    public string email
    {
        get { return _email; }
        set { _email = value; }
    }

}

Class này là lớp properties dùng để get set biến dữ liệu và bạn có thể viết thêm các hàm liên quan ví dụ như trên mình viết thêm hàm mã hóa chuổi pass dùng trước khi chúng ta nhập liệu và insert password cũng như đăng nhập. Tiếp đến class rất quan trọng trong mô hình 3 lớp asp.net đó là nguoidungdao.cs đây là lớp chứa tất cả các hàm lấy dữ liệu, insert, xóa, sửa dữ liệu.

<!--
public class nguoidungdao:dataprovider
{
    //phuong thức từ lớp nguoidungdto
    public nguoidungdto[] get()
	{
        string sql = "select * from NguoiDung";
        DataTable dt = get(sql).Tables[0];
        nguoidungdto[] obj = new nguoidungdto[dt.Rows.Count];
        int i, n = dt.Rows.Count;
        for (i = 0; i < n; i++)
        {
            obj[i] = new nguoidungdto();
            obj[i].mand = dt.Rows[i]["mand"].ToString();
            obj[i].hoten = dt.Rows[i]["hoten"].ToString();
            obj[i].tendangnhap = dt.Rows[i]["tendangnhap"].ToString();
            obj[i].matkhau = dt.Rows[i]["matkhau"].ToString();
            obj[i].gioitinh = bool.Parse(dt.Rows[i]["gioitinh"].ToString());
            obj[i].email = dt.Rows[i]["email"].ToString();
        }
        return obj;
	}

    public void insert(nguoidungdto dto)
    {
        string sql = "insert into NguoiDung values('" + dto.mand + "',N'" + dto.hoten + "','" + dto.tendangnhap + "','" + dto.matkhau + "','" + dto.gioitinh + "','" + dto.email + "')";
        ExecuteNonQuery(sql);
    }

    public void update(nguoidungdto dto)
    {
        string sql = "update NguoiDung set  hoten=N'" + dto.hoten + "',matkhau='" + dto.matkhau + "',gioitinh='" + dto.gioitinh + "',email='" + dto.email + "'   where mand='" + dto.mand + "'";
        ExecuteNonQuery(sql);
    }

    public void delete(nguoidungdto dto)
    {
        string sql = "delete from NguoiDung where madn='" + dto.mand + "'";
        ExecuteNonQuery(sql);
    }
}
-->

Bạn có thể thấy được lớp này kế thừa lớp dataprovider và khởi tại đối tượng của lớp nguoidungdto để get set dữ liệu, trong đó có phức tạp nhất là hàm get() tuy nhiên cũng khá là cơ bản, các bạn xem và có căn bản về ASP.Net là hiểu được nó trả về mảng dữ liệu có kiểu DataTable chưa dữ liệu select được từ truy vấn sql. Tiếp đến mình sẽ đến Class control.cs lớp này dùng để kết nối và gọi hàm từ các lớp khác.

public class nguoidungcontrol
{
    nguoidungdao dao = new nguoidungdao();

    public nguoidungdto[] get()
    {
        return dao.get();
    }
    public void insert(nguoidungdto dto)
    {
        dao.insert(dto);
    }
    public void update(nguoidungdto dto)
    {
        dao.update(dto);
    }
    public void delete(nguoidungdto dto)
    {
        dao.delete(dto);
    }
}
Sử dụng class trong mô hình 3 lớp

Các class đã được tạo ra và bây giờ chúng ta tiến hành áp dụng và trong form mà mình đã tạo ra ở trên. Đầu tiên là hàm load dữ liệu từ CSDL hàm này bạn viết như sau:

     nguoidungcontrol ct = new nguoidungcontrol();
     nguoidungdto dto = new nguoidungdto();

    public void load_data()
    {
        gvNguoiDung.DataSource = ct.get();
        gvNguoiDung.DataBind();
    }

Bạn khai báo đối tượng ct của lớp nguoidungcontrol và dto của lớp nguoidungdto, trong hàm get dữ liệu tạm thời mình không sử dụng đến đối tượng dto tuy nhiên tạo ra lát nữa khi xuống insert, xóa, sửa, sẽ dùng đến. Bạn có thể thấy gvNguoiDung là ID của gridview đã tạo sẳn trong đó, hiển nhiên là các đối tượng trong đó sẽ tương ứng với Database. Bạn vào PageLoad gọi hàm để khi load trang lên ta thấy dữ liệu luôn.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            load_data();
        }
    }

Mục đích mình tạo ra hàm load_data() để khi thêm xóa sửa xong sẽ gọi hàm này để khi thực hiện mình biết ngay kết quả luôn.

hien thi du lieu theo mo hinh 3 lop

Get dữ liệu theo mo hình 3 lớp

Tiếp đến chúng ta sẽ thực hiện các thao tác thêm, xóa, sửa sử dụng mô hình 3 lớp ASP.Net, bạn sẽ thấy mọi thứ sẽ đơn giản, code dễ dàng quản lý hơn khi dùng mô hình 3 layer này. Lúc này mình mới dùng đến đối tượng dto khởi tạo ở trên, gán giá trị cho nó và thự hiện chức năng gọi từ đối tượng ct của lớp nguoidungcontrol.

protected void btThem_Click(object sender, EventArgs e)
{
    dto.mand = txtMaNguoiDung.Text;
    dto.hoten = txtHovaTen.Text;
    dto.tendangnhap = txtTenDangNhap.Text;
    dto.matkhau = dto.mahoa(txtMatKhau.Text);
    dto.gioitinh = bool.Parse(radioGioiTinh.SelectedItem.Value);
    dto.email = txtEmail.Text;
    ct.insert(dto);
    load_data();
}
protected void txtSua_Click(object sender, EventArgs e)
{
    dto.mand = txtMaNguoiDung.Text;
    dto.hoten = txtHovaTen.Text;
    dto.tendangnhap = txtTenDangNhap.Text;
    dto.matkhau = dto.mahoa(txtMatKhau.Text);
    dto.gioitinh = bool.Parse(radioGioiTinh.SelectedItem.Value);
    dto.email = txtEmail.Text;
    ct.update(dto);
    load_data();
}
protected void txtXoa_Click(object sender, EventArgs e)
{
    dto.mand = txtMaNguoiDung.Text;
    ct.delete(dto);
    load_data();
}
ket qua demo mo hinh 3 lop asp.net

Kết quả demo 3 layer

Kết luận: Mô hình 3 lớp là sự lựa chọn hoàn hảo cho thiết kế web asp.net, code rõ ràng, rất dễ cho bạn quản lý thay vì phải code trong 1 file. Bài phía trên bcdonline.net chỉ demo tính năng về cách sử dụng mô hình 3 layer nên chưa fix và bẩy lỗi. Các bạn có thể ngâm cứu thêm 🙂 Chúc thành công!
DOWNLOAD FILE DEMO

VN:F [1.9.22_1171]
Rating: 7.8/10 (16 votes cast)
Xây dựng mô hình 3 lớp - three layer trong ASP.Net, 7.8 out of 10 based on 16 ratings
Share This