Demo mô hình 3 lớp

Trong phần trước mình đã giới thiệu cơ bản về mô hình 3 lớp, trong phần này mình sẽ thực hiện 1 ví dụ về mô hình 3 lớp này.

Cơ sở dữ liệu

Lướt qua cơ sở dũ liệu tí nào, đơn giản thôi. Ở đây Id là khóa chính tự động tăng cho đơn giản nhé.

Giao diện

Tổ chức Project

Phân chia 3 lớp theo 3 thư mục như sau

StudentDTO

Nên nhớ đây không phải là 1 layer mà chỉ là đối tượng trao đổi dữ liệu giữa các layers. Có thể bỏ các namespace không cần thiết đi.

StudentBLL

Các nghiệp vụ chính xử lí cho lớp Student. Ở đây gồm 3 phương thức cơ bản là lấy danh sách, thêm, xóa và cập nhật.

Có 2 chú ý như sau:
  1. Phương thức Remove(string name) nên nhận vào tham số là khóa chính (Id), nhưng vì ở đây mình ví dụ khóa chính là số tự động tăng nên dùng tên cho đơn giản.
  2. Lớp xử lý nghiệp vụ sẽ gọi lại các phương thức xử lý ở DAL nên trước hết chỉ cần viết đúng ngữ nghĩa, logic sẽ được xử lý sau.

StudentDAL

Đầu tiên sẽ là phương thức lấy danh sách tất cả các học sinh, việc này đơn giản chỉ là gọi câu lệnh (trong sql)

select * from Students

Mình đã có phương thức để trả về 1 DataTable trước đó, chỉ cần gọi là truyền vào câu truy vấn như trên để lấy về 1 bảng danh sách các học sinh, từ đó với mỗi hàng dữ liệu chỉ cần lấy ra các cột tương ứng.

Trong đó:

Lớp DataHelper như đã giới thiệu ở phần ADO.NET (*)

(*) Bài viết về ADO.NET sẽ được giới thiệu sau.

Và phương thức GetStudentFromDataRow như sau

Vô cùng dễ hiểu phải không!

Vậy là mình đã có 2 layers là BLL và DAL. Giờ sẽ là phần việc của layer thứ 3: GUI. Trong giao diện mình sẽ hiển thị ra danh sách của học sinh (1), việc lấy danh sách sẽ được BLL đưa ra (2), và BLL sẽ gọi DAL (3) để lấy danh sách từ CSDL. Bạn đã thấy được mô hình 3 lớp hoạt động thế nào chưa? Và giữa 3 lớp đó, DTO (StudentDTO) chỉ là lớp lưu trữ dữ liệu và trao đổi giữa các lớp đó mà thôi.

GUI

Và kết quả

Tổng quan mô hình

Hãy xem xét cách làm việc tổng thể của mô hình như sau

Không có gì cần phải giải thích nhiều. Ở đây, tầng trên muốn làm gì thì gọi tầng dưới làm thay, tầng dưới làm xong rồi thì trả kết quả lại cho tầng trên. Vô cùng đơn giản!

Phần còn lại...

Bây giờ thì bạn đã hiểu cách hoạt động của mô hình 3 lớp, do vậy các phương thức còn lại không khó để viết. Sau đây là phần thêm mới 1 sinh viên cho button Add.

Trong BLL

Trong DAL

Vì đây chỉ là ví dụ nên mình ghi câu lệnh query dạng như vậy. Trong thực tế, nếu các bạn viết như vậy rất dễ bị tấn công sql injection (google search) - nôm na là 1 dạng "hack". Do vậy các bạn nên sử dụng kiểu add Parameters hoặc tối ưu bằng Stored Procedure.

Hoàn toàn tương tự đối với phần Update, do vậy các bạn hãy thử tự mình code phần đó đi nhé.

Source code

Comments

  1. Cho mình xin cái source đi bạn.

    ReplyDelete
    Replies
    1. Của bạn đây: https://www.dropbox.com/s/pk9yyjji9gmitlv/3layers.rar?dl=0

      Delete
  2. sủa, xóa sao bạn? :D

    ReplyDelete
    Replies
    1. Xóa, sửa bạn làm tương tự, chỉ thay bằng câu lệnh delete và update thôi. Bạn có thể download source code ở comment trên để xem.

      Delete
  3. Chào bạn. Trong code có sử dụng connectionstring ... Mình muốn hỏi là nếu dùng như thế thì đâu biết được là chương trình sẽ vào đúng csdl nào và đúng table nào ??? Bạn phản hồi nhé :))
    "
    public DataHelper()
    {
    var connStr = ConfigurationManager.AppSettings["ConnectionString"];
    _connection = new SqlConnection(connStr);
    }
    "

    ReplyDelete
  4. Cách tạo nhanh cái DTO như thế nào bạn?

    ReplyDelete
    Replies
    1. : ) nó là 1 class bình thường nên cũng chỉ có thể add bình thường thôi nhé @Dẫn

      Delete
  5. Service Interface,Service Interface,Bussiness Component,Bussiness Entities là gì, công dụng và chức năng của chúng trong BLL. ad có thể giải thích cho mình được không ạ

    ReplyDelete
    Replies
    1. hi,

      trong mô hình 3 layers, bạn làm sao để các layer phân tách ra rõ ràng và đảm nhận 1 vai trò chuyên biệt là được, còn chuyện đặt tên nó ra sao thì tùy mỗi người. Hơn nữa trong ví dụ của mình không dùng những khái niệm đó, bạn có thể đưa sample để mình giải thích rõ ràng hơn.

      Delete
    2. Ad dành ít thời gian giải đáp câu hỏi của mình ạ.

      -Khi thiết kế BLL thì không nhất thiết phải có 4 phần :Service Interface,Service Interface,Bussiness Component,Bussiness Entities đúng không ạ

      mình có 4 bảng:
      TB_DocGia(id_Docgia(Pk), hovaten)
      TB_phieumuon(id_phieumuon(Pk), id_docgia(fk), ngaymuon)
      TB_ChiTietPhieuMuon( id_phieumuon(fk), id_sach(fk))
      TB_Sach(Id_sach (pk), tensach )

      Trên GUI (Phiếu mượn) có 1 table mình muốn hiển thị mình muốn hiện thị tất cả các thông tin của 4 bảng kia thì ở phần BLL mình thiết kế như thế nào ạ.


      Kiến thức của mình còn kém, nếu câu hỏi sai mong AD bỏ qua. mình có tìm hiểu kha khá trên youtube hay GG mà chưa thu được nhiều lắm kết quả, Hi vọng AD giúp mình , mình trân thành cảm ơn ạ


      -

      Delete
    3. có lẽ bài viết của mình không được hữu ích với bạn lắm nên bạn mới có những câu hỏi như thế này. Chuyện này mình không thể giải thích cho bạn hiểu bằng comment được vì comment cũng giống như bài post của mình ở trên. Nếu bạn muốn chi tiết có thể add skype của mình "oclockvn" để tiện trao đổi. Cheers.

      Delete

Post a Comment

Popular posts from this blog

Gỡ bộ Visual Studio ra khỏi máy tính

Căn giữa thẻ div trong thẻ div