Một ví dụ về mô hình 3-tiers


Tranh thủ hôm cuối tuần, gửi con đi nhà trẻ, lên công ty viết cái ví dụ này. Hi vọng sẽ giúp ích cho những ai quan tâm.

Đây là một ứng dụng quản lý sách được viết dựa trên mô hình 3 tầng (3-tiers ), sử dụng LINQ to SQL như lớp truy xuất dữ liệu (DAL). Vì đây là một ứng dụng mẫu nên tôi đã cố gắng giảm thiểu chức năng cũng như việc dùng các tính năng được hỗ trợ bởi COM+, giúp chương trình đơn giản, dễ hiểu.

Các chức năng được cung cấp bao gồm Đăng nhập, Thêm sách và Tìm sách.

Mã nguồn có thể tải về tại đây: https://github.com/daohainam/demo3tiers

Sau khi chạy lần đầu tiên, các bạn sẽ thấy một đối tượng COM+ mới được tạo ra trong Component Explorer (Start/Run/comexp.msc):

Đây là một đối tượng COM+, cách nó thực thi không giống với các lớp thông thường khác. Vì đây chỉ là một ví dụ đơn giản nên tôi không sử dụng thêm các dịch vụ hay cấu hình gì đặc biệt, cũng như tôi sử dụng cách đăng ký lớp COM+ tự động, tôi sẽ hướng dẫn từng bước cách tạo ra ứng dụng này và cải tiến nó để dùng các dịch vụ nâng cao được cung cấp bởi dịch vụ COM+ trong cái bài viết sau này.

Chú ý trước khi chạy, các bạn cần chạy script SQL có trong file Database.sql để tạo cơ sở dữ liệu, và các bạn cần chạy ứng dụng dưới quyền Administrator trong lần chạy đầu tiên.

Hi vọng ví dụ này sẽ giúp các bạn hiểu rõ hơn mô hình này, cũng như giải đáp cho các bạn có thắc mắc về việc sử dụng LINQ to SQL như lớp DAL. Hiểu rõ về mô hình 3 tầng sẽ giúp các bạn có một cái nhìn tốt hơn trong việc thiết kế ứng dụng.

Xem thêm về mô hình 3 lớp ở bài viết sau: Hỏi đáp về mô hình 3 lớp.

44 thoughts on “Một ví dụ về mô hình 3-tiers

  1. thx anh.Ví dụ rất hay.Nhưng em có 1 khúc mắc là với mỗi Anonymous Types trả về trong method của lớp DAL mình lại phải sinh thêm 1 entity để tranfer ( theo cách anh làm ).Không biết còn cách nào tối ưu hơn cách này ko ạ.

  2. Điều này là không bắt buộc, nhưng là một “Best-Practic”.
    Nếu không dùng, em vẫn phải dùng một cách nào đó để truyền dữ liệu, như dùng DataTable, hay trả thẳng đối tượng entity của LINQ, nhưng mỗi cái đều có hạn chế, ví dụ dùng DataTable thì không chặt chẽ về kiểu, dùng entity của LINQ thì làm giảm tính dependency vì khi đó presentation lại phải phụ thuộc lớp LINQ của em.
    Mà sự thực thì tạo ra các lớp DTO này cũng không có gì mất công lắm 🙂

  3. Ah a có Mã nguồn về ứng dụng quản lý sách mô hình 3 tiers viết bằng c# và công nghệ linq to sql Post luôn nhé.vì e không rành java.thank a

  4. Ah Sorry a,ah cho e hỏi luôn,com+ cũng giống như .dll của .net phải không a?

  5. Không em, nó được chứa trong file dll nhưng cách hoạt động khác với các dll bình thường

  6. ủa? dll hoạt động ko như bình thường là sao vậy huynh, em cũng ko rõ lắm về 3 tầng này, nếu như nói về 3 tầng và 3 lớp thì cái nào tốt hơn vậy? chúng khác nhau chổ nào vậy? huynh có thể giải thích rõ hơn cho em út hiểu chút it nửa được ko?

  7. DLL thực chất chỉ là 1 dạng file chứa mã thực thi được, tương tự file exe, tuy nhiên tùy thuộc vào loại chương trình chứa bên trong mà nó sẽ được nạp vào bộ nhớ và thực thi thế nào. Ví dụ file exe thì được nạp vào vùng nhớ riêng (của process mới được tạo), trong khi 1 thư viện DLL thì lại có thể được nạp và ánh xạ vào vùng nhớ của một tiến trình có sẵn, thậm chí là nhiều tiến trình khác nhau có thể cùng ánh xạ vào vùng nhớ code của 1 DLL duy nhất…
    Còn các COM+ như trên cũng chứa mã thực thi nhưng cách nó được nạp vào bộ nhớ, cách nó được thực thi… lại không giống 1 DLL bình thường, thậm chí 1 COM+ có thể chạy riêng trong tiến trình của nó. Nếu em muốn hiểu rõ thì nên tìm một cuốn sách về COM+, trong đó nói chi tiết hơn.
    Còn sự khác nhau giữa 3 tầng và 3 lớp thì em có thể xem câu 2 trong bài “Hỏi đáp mô hình 3 tầng” tại đây: https://namdh.wordpress.com/2009/12/31/3-tiers-faq/

  8. Đây là một đối tượng COM+, cách nó thực thi không giống với các lớp thông thường khác. Vì đây chỉ là một ví dụ đơn giản nên tôi không sử dụng thêm các dịch vụ hay cấu hình gì đặc biệt, cũng như tôi sử dụng cách đăng ký lớp COM+ tự động, tôi sẽ hướng dẫn từng bước cách tạo ra ứng dụng này và cải tiến nó để dùng các dịch vụ nâng cao được cung cấp bởi dịch vụ COM+ trong cái bài viết sau này.

    — bài viết của bạn rất hay…
    bạn có thể hướng dẫn từng bước trong project này ko ???

  9. Cho mình hỏi xíu, khi chạy chương trình này với VisualStudio hiện lên một form login, vậy đăng nhập bằng tên với pass là gì ạ, thanks

  10. admin/admin hoặc guest/guest bạn ạ
    User/pass được lưu trong database

  11. Chao ban !!
    Em la Nhat co Nick yahoo la thainhat2003@yahoo.com
    minh cung dang tim hieu ve code Linq nhung giap 1 van de, ma den gio van chua giai quyet duoc, anh co the chia se 1 it kinh nghiem duoc khong? minh thuong dung LinQ 1 lop!! Nhung khi dong gop phan mem dem den may khach minh khong the ket noi voi co so du lieu tren may duoc, minh phai vao file config sua lai chuoi ket noi!! Minh thay lam vay that su bat tiien!! ban co cach nao giai quyet van de nay ma khong phai vao file config sua chuoi ket noi khong ban!! Rat cam on ban

  12. Lưu chuỗi kết nối vào file config là 1 trong những cách đơn giản nhất, nhưng em cũng có thể chọn 1 cách khác như lưu vào registry, nếu dùng COM+ thì em có thể lưu vào chuỗi khởi tạo đối tượng…
    Cái nào cũng có ưu nhược điểm cả, tuy nhiên trên thực tế thì chuỗi này không thay đổi thường xuyên nên cũng không nên chọn cách quá tiết kiệm công sức mà lại ảnh hưởng tới bảo mật, an toàn…

  13. Mong anh Nam viết 1 bài về điểm khác nhau trong cách lập trình với COM+ và dll được không ạ? Còn chuyện “tuy nhiên trên thực tế thì chuỗi này không thay đổi thường xuyên nên cũng không nên chọn cách quá tiết kiệm công sức mà lại ảnh hưởng tới bảo mật, an toàn” em cũng mong anh giúp em hiểu ưu và khuyết điểm của dùng file web.config trong ASP.NET, các bảo mật file này cũng như nên dùng file này hay dùng luôn trong chuỗi kết nối trong mã nguồn khi cần sử dụng.

    Em thật sự đọc cũng nhiều tài liệu tren internet nhưng vẫn còn mơ hồ về cái bảo mật cho web.config và bảo mật thông tin trong đó, phương án sử dụng nào cho tối ưu ? Cứ mãi đau đầu về bảo mật và tiện dụng của web.config

  14. Em open bằng VS 2005 ko dc anh ạ, nó báo lỗi:
    “The selected file is a solution file, but was created by a newer version of this application and cannot be opened.” nhấn OK thì lại báo lỗi tiếp:
    “The operation could not be completed. Unspecified error “, em phải làm sao đây ?

  15. Em đang viết project Quản lý nhà sách onlien bằng ngôn ngữ ASP.Net (C#) với mô hình 3 tiers + Linq ! Mong a Nam giúp đỡ ! cám ơn anh !

  16. He he, giúp đỡ sao đây? Em mắc chỗ nào thì hỏi anh sẽ trả lời.

  17. anh có thể viết giúp em phương thức Load sách từ CSDL sử dụng Linq và mô hình 3 lớp trong asp.net đc hok ah? em viết đc phương thức thêm sách như anh, nhưng khi Load sách, và xóa Sách thì viết nó báo lỗi! e sử dụng GridView để Load ds Sách lên nhưng ko đc! em muốn là khi Thêm sách thành công thì Sách đc thêm hiển thị trên GridView luôn!e cám ơn a!

  18. anh có thể giải thích thêm : IList trong Linq đc hok ah!

  19. mình nghĩ cac bạn nên tự viết rồi nếu bị lỗi thì gửi bài nhờ giúp chứ đừng có nhờ “trọn gói” như vậy sẽ ko ai rảnh mà làm cho đâu, quy tắc HELP đơn giản vậy mà ko biết, bài làm của mình mà cứ nhào nhào bắt người ta làm cho thì …

  20. Bạn nào chỉ mình cách chạy script SQL có trong file Database.sql với đc ko. Mình ko biết làm thế nào. 🙂
    Hướng đẩn càng cụ thể càng tốt. Thank so much!

  21. Cho mình hỏi là tại sao phải tạo thêm 1 class Book trong file BookDTO.cs trong khi class này đã tạo tạo tự động trong Demo3Tiers.designer.cs bởi LINQ Extractor (khi dùng LINQ TO SQL Classes)?

  22. anh ơi có phải trong mô hình 3 lớp không cần tạo csdl không.cách tạo các lớp TDO và TAO với.cảm ơn a nha.

  23. @lulu2792: Đây không phải là bắt buộc. Em có thể dùng lại lớp Book trong DB context, tuy nhiên khi đó tất cả các tầng sẽ đều phải reference đến DAL, kể cả presentation. Tùy từng trường hợp mà cần cân nhắc có nên tạo thêm các DTO hay không.

  24. @Khách: cần tạo CSDL hay không thì tùy vào phần mềm của em có dùng CSDL hay không, chứ không phải do mô hình 3 tầng

  25. anh Nam cho em hỏi câu hỏi cái này nhe.
    Cái Demo3Ties.dbml là tầng DATA đúng ko anh
    Còn BookManagementService.cs là tầng BusinessLogic
    Còn mấy cái Form ở Project 2 là phần View phải ko anh

    Nếu đúng vậy sao em thấy anh viết thêm mấy cái như Demo3Tiers.snk (Em thật sự không biết cái này để làm gì và nó từ đâu ra nữa) và BookDTO.cs (cái này em nghỉ có hay ko thì tùy, nhưng em muốn biết anh thêm cái đó có chức năng gì. Tại vì em thấy nhiều Project trên mạng họ cũng có mấy cái đó?)

    Với lại trong bài này hình như anh chưa có view danh sách những quyển sách, và phần search ( hình như chỉ mới viết cái Module cho nó ah)

  26. Chào anh Nam, cho em hỏi lớp BookManagementService được thừa kế từ System.EnterpriseServices.ServicedComponent, em đoán đây dùng để tạo đối tượng com+, nhưng em khong hiểu nó có tác dụng gì ở đây. Nếu ko có thừa kế lớp này, chương trình vẫn tạo được dll bình thường, và lớp presentation vẫn reference được tơi dll đó thôi.

    Em không hiểu nếu tầng presentation và business đặt ở các máy khác nhau, không biết lúc đó presentation sẽ giao tiếp với business như thế nào đây khi mà không có đll để refer tới.

    Trong vd của anh, em vẫn chưa thấy sự độc lập khi triển khai các tầng trên 3 máy khác nhau. Mong anh giải thích thêm, cảm ơn anh.

  27. anh cho em hỏi, chẳng hạn như là mình viết 1 method để join giữa các bảng với nhau, thì phương thức đó sẽ trả về cái gì để tầng presentation sẽ nhận được. Nếu như mà riêng các bảng thì có thể trả về các bảng đó nhưng mà khi join thì em ko biết nó sẽ trả về cái gì.
    Nếu như mà dùng ADO.NET thì có thể trả về 1 cái dset hay datatable.
    Em cảm ơn

  28. @stevenChow: Nếu không thừa kế từ ServicedComponent, lớp BookManagementService chỉ là một lớp bình thường, chạy bên trong cùng không gian địa chỉ của chương trình có reference đến nó. Nếu là một ServicedComponent, nó sẽ được chạy như 1 đối tượng COM+, tức được host bởi COM+ container của Windows, các lời gọi đến các phương thức bên trong trở thành các lời gọi liên tiến trình (IPC). Vì nó hoàn toàn độc lập với chương trình gọi nên nó có thể “đặt ở đâu cũng được”.
    Để triển khai trên nhiều máy khác nhau em cần làm thêm 1 vài bước trong quá trình cài đặt, em có thể tham khảo các tài liệu về COM+ để biết thêm.

  29. @vnlevanduoc: File .snk được dùng để ký lên các file assembly để tạo strong name, phải có strong name để đăng ký đối tượng COM+. Em có thể tạo ra file này bằng cách vào property của project, vào phần signing, check vào ô Sign the assembly và chọn New trong combo box bên dưới.

  30. thầy ơi thầy có thể quay video hướng dẫn chi tiết về mô hình 3 tầng được không thầy , trước giờ lúc học em chỉ được biết mô hình 3 lớp và làm với 3 lớp chứ chưa được học và làm với mô hình 3 tầng
    cảm ơn thầy !

  31. Bạn nam có thể up lại link được không ? Link không tồn tại

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 )

Facebook photo

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

Connecting to %s