MVC design pattern và cách chúng ta hỗ trợ trong Mini-Web-Server – phần 2

MVC là gì?

Model-View-Controller là một mẫu thiết kế cho phép ta phân tách các thành phần theo 3 chức năng:

  • Các thực thể (entity) chứa dữ liệu, hay còn gọi là Model.
  • Các View có nhiệm vụ hiển thị dữ liệu.
  • Các Controller có nhiệm vụ điều phối Model đến View.

Việc phân tách này giúp chúng ta tách biệt các thành phần với các chức năng hoàn toàn độc lập, và mang lại những lợi ích sau:

  • Dễ thay đổi: Một thay đổi nào đó trên giao diện chỉ ảnh hưởng đến View. Giả sử chương trình của bạn cần cung cấp các trang hiển thị thông tin sản phẩm khác nhau: cho người dùng web, cho người dùng trên các thiết bị màn hình nhỏ, cho máy in… thì chỉ cần tạo ra các view khác nhau, tất cả những gì trong Model hoặc code tải thông tin sản phẩm trong Controller đều không cần thay đổi.
  • Dễ test: bạn hoàn toàn có thể viết các unit test riêng biệt cho Controller (chứa business logic) hoặc View (để test giao diện), một tester cũng có thể test các view thông qua các Fake/Mock object mà không cần chờ Controller hoàn thiện.
Continue reading “MVC design pattern và cách chúng ta hỗ trợ trong Mini-Web-Server – phần 2”

MVC design pattern và cách chúng ta hỗ trợ trong Mini-Web-Server – phần 1

Loạt bài này sẽ nói về MVC design pattern, cách chúng ta thiết kế các thành phần để hỗ trợ MVC trong Mini-Web-Server.

Mô hình MVC, lưu ý hướng các mũi tên, các bạn có thể sẽ nhìn thấy nhiều hình minh họa khác với số lượng/hướng mũi tên khác nhau. Tôi sẽ giải thích kỹ hơn về điều này khi chúng ta đi vào chi tiết.

Nếu theo dõi blog này và trang Facebook Nam.NET chắc mọi người không lạ gì project Mini-Web-Server (trang github), một web server đơn giản để thông qua đó giới thiệu về những công nghệ, mẫu thiết kế, kiến trúc phổ biến, giúp các bạn hiểu sâu hơn về những gì các bạn đang sử dụng hàng ngày. Hiện tại chúng ta đã có một mini server gọn nhẹ, chạy nhanh và hỗ trợ đầy đủ các method, hỗ trợ HTTPS, các nội dung tĩnh, cho phép viết các hàm phục vụ người dùng giúp phát triển các API, cung cấp đầy đủ session, authentication/authorization thông qua JWT và cookie…

Nhưng điều quan trọng nhất mà chúng ta đạt được (cũng như tôi muốn nhấn mạnh) khi viết Mini-Web-Server không phải là nó đã hỗ trợ những gì, mà lại là việc thêm vào những tính năng mới dễ dàng như thế nào. Thông qua một kiến trúc rõ ràng và nhiều design pattern, chúng ta có một ứng dụng với các module độc lập với nhau, gắn kết với nhau thông qua các policy. Khi thay thế module phân tích các request từ sử dụng Regular Expression sang việc phân tích trực tiếp mảng byte, chuyển từ mô hình sync sang async…, chúng ta hầu như không phải làm gì khác ngoài viết module mới và thay thế với module cũ, tất cả các phần khác đều giữ nguyên. Thông qua một loạt các cơ chế dựa trên “Dependency Inversion” như Callable, Callable filters, middleware… ta có thể mở rộng ra tới chừng nào ta muốn. Và đó là thứ quan trọng nhất mà tôi muốn mang đến cho các bạn thông qua project này.

Tất cả các ứng dụng trong thực tế đều sẽ thay đổi theo thời gian, lớn hơn, nhiều yêu cầu mới phát sinh, mô hình triển khai thay đổi và thậm chí các chức năng cũng thay đổi, do vậy việc quan trọng nhất đối với một người thiết kế đó là làm ra một ứng dụng có thể dễ dàng chỉnh sửa và bảo trì, hơn là làm cho nó chạy đúng. Điều này nghe có vẻ buồn cười nhưng thử nghĩ xem, nếu chỉ để một chương trình chạy đúng (vào một thời điểm cụ thể) thì bạn đâu cần phải thiết kế? Bạn không cần các interface, không cần đa hình, khi thêm một chức năng mới, bạn chỉ việc copy từ một chức năng tương tự đã có và sửa lại một chút… Bạn sẽ có những file mã nguồn, những function hàng ngàn dòng mà đến người viết còn không hiểu nó chạy thế nào, và khi có một yêu cầu mới, bạn chỉ mong ước có thể đập ra làm lại từ đầu. Một chương trình dễ bảo trì sẽ dễ dàng được làm cho chạy đúng, nhưng một chương trình chạy đúng với một thiết kế tồi lại không chắc sẽ chạy đúng mãi (sau khi thêm các chức năng mới hoặc thay đổi trong tương lai).

Quay lại với Mini-Web-Server, chúng ta đã hỗ trợ nhiều tính năng (như quảng cáo :D), nhưng những gì các bạn nhìn thấy chỉ là một trang web đơn giản, với vài tính năng demo. Thực sự mà nói, chừng đó cũng đã đủ để bạn viết một ứng dụng web, với nội dung tĩnh trong các trang HTML, và dữ liệu động được cung cấp bởi các API. Các tính năng cơ bản này cho phép bạn viết các ứng dụng SPA (single page app) dễ dàng, hoặc cung cấp backend API cho một mobile app. Nhưng nếu muốn viết một web app bình thường với nhiều trang thì sao? Có lẽ chúng ta cần thêm một cơ chế khác nữa.

Một lựa chọn phổ biến với người viết web .NET là ASP.NET MVC, một framework cực kỳ mạnh mẽ, hỗ trợ nhiều tính năng và cực kỳ mềm dẻo (flexible), cho phép chúng ta phát triển các ứng dụng với code .NET, render nội dung với Razor, các tham số được tiền xử lý và gửi đến các action, người lập trình hầu như chỉ cần tập trung vào việc viết code xử lý, các request/response sẽ được xử lý tự động thông qua các policy được ASP.NET hỗ trợ… Vì vậy nếu Mini-Web-Server cũng hỗ trợ một mô hình như vậy thì các nhà phát triển sẽ dễ dàng xây dựng các ứng dụng dựa trên “Mini MVC” thay vì ASP.NET MVC :D. Và có lẽ đây sẽ là tính năng lớn nhất mà Mini cung cấp, là một hành trình mất nhiều tháng để hoàn thành, và tôi muốn chia sẻ cùng các bạn hành trình này, từ các bước chúng ta thiết kế, cho đến việc implement, và thậm chí những sai sót khi thiết kế đã dẫn đến những vấn đề gì. A ha! Bạn nghĩ đúng rồi đó! Tôi vẫn thường xuyên sai sót khi thiết kế và cả khi code nữa!

Nhưng trước tiên chúng ta phải hiểu một cách chính xác MVC là gì và nó hoạt động như thế nào.

(hết phần 1)

Thêm Model

Trong phần này bạn sẽ thêm các lớp để quản lý phim ảnh chứa trong CSDL. Các lớp đó sẽ là phần “model” của ứng dụng ASP.NET MVC.

Bạn sẽ dùng một công nghệ truy cập cơ sở dữ liệu trong .NET Framework được biết đến như Entity Framework để định nghĩa và làm việc với các lớp mô mình này. Entity Framework (hay được gọi ngắn gọn là EF) hỗ trợ một phương thức phát triển được gọi là Code First. Code First cho phép bạn tạo các đối tượng dữ liệu bằng cách viết các lớp đơn giản. (Các lớp này được biết như các lớp POCO, viết tắt từ “plain-old CLR objects”). Bạn có thể tạo luôn CSDL ngay lúc chạy, cho phép bạn phát triển ứng dụng nhanh chóng và sáng sủa.

Continue reading “Thêm Model”

ASP.NET MVC 5: Thêm View

Trong phần này chúng ta sẽ sửa lại lớp HelloWorldController class để dùng các file template cho view nhằm giúp việc tạo phản hồi dạng HTML về cho trình duyệt dễ dàng hơn.

Bạn sẽ tạo một file template sử dụng Razor view engine. Các file view dựa trên Razorcó phần mở rộng .cshtml, và cung cấp một các rõ ràng để tạo ra nội dung HTML sử dụng C#. Razor tối thiểu hóa số ký tự và số lần gõ phím để viết một template, và cho phép việc code nhanh chóng và trôi chảy hơn.

Hiện tại phương thức Index trả về một chuỗi với một thông điệp được hard-coded trong lớp controller. Sửa lại phương thức Index để trả về một đối tượng View, như hình dưới đây:

public ActionResult Index() 
{ 
    return View(); 
}

Phương thức Index ở trên dùng một view template để tạo ra nội dung HTML trả về trình duyệt. Các phương thức của controller (còn gọi là các phương thức action – action method), kiểu như Index ở trên, thông thường sẽ trả về một đối tượng ActionResult, hoặc một lớp thừa kế từ ActionResult, chứ không phải một kiểu nguyên thủy như string.

Continue reading “ASP.NET MVC 5: Thêm View”

ASP.NET MVC 5: Thêm Controller

MVC được viết tắt từ model-view-controller.  MVC là một mẫu thiết kế cho việc phát triển các ứng dụng có kiến trúc tốt, dễ kiểm lỗi và dễ bảo trì. Một ứng dụng MVC chứa các thành phần sau:

  • Models: Là các lớp dùng để biểu diễn dữ liệu và có thể có các phép kiểm tra để đảm bảo dữ liệu chứa trong nó phù hợp với logic của ứng dụng.
  • Views: Các file template dùng để tạo ra nội dung HTML.
  • Controllers: Các lớp xử lý các yêu cầu từ trình duyệt, lấy về các Model, và chọn View tương ứng để trả về cho trình duyệt.

Chúng ta sẽ cùng khám phá các khái niệm này trong loạt bài này và tôi sẽ cho bạn thấy các dùng chúng để xây dựng một ứng dụng.

Continue reading “ASP.NET MVC 5: Thêm Controller”

Bắt đầu với ASP.NET MVC 5

Loạt bài này sẽ hướng dẫn bạn các bước cơ bản để tạo một ứng dụng ASP.NET MVC 5 sử dụng Visual Studio 2013 Preview. Một ứng dụng Visual Web Developer với mã nguồn C# cũng có sẵn để tải về, bạn có thể download tại đây.

Trong loạt bài này bạn sẽ chạy ứng dụng với Visual Studio. Bạn cũng có thể đưa ứng dụng lên Internet nếu triển khai nó đến một nhà cung cấp dịch vụ hosting. Microsoft cũng có cung cấp dịch vụ hosting miễn phí cho 10 web site nếu bạn có một tài khoản Windows Azure dùng thử miễn phí. Loạt bài này được viết bởi Scott Guthrie (twitter @scottgu ), Scott Hanselman  (twitter: @shanselman ), và Rick Anderson.

Bắt đầu

Trước tiên bạn sẽ cần cài đặt Visual Studio Express 2013 Preview for Web hoặc Visual Studio 2013 Preview.

Visual Studio là một trình IDE (trình tích hợp soạn thảo và các công cụ phát triển), cũng giống như bạn dùng Word để viết tài liệu, bạn sẽ dùng một IDE để viết ứng dụng. Trong Visual Studio, có một thanh công cụ dọc phía trên hiển thị một số tùy chọn cho bạn. Ngoài ra còn có một thanh menu cung cấp một cách khác để thực hiện các nhiệm vụ trong IDE (Ví dụ, thay vì chọn New Project từ trang Start, bạn cũng có thể dùng menu và chọ File>NewProject).

Continue reading “Bắt đầu với ASP.NET MVC 5”

Thực hiện các tính năng CRUD với Entity Framework trong ứng dụng ASP.NET MVC

Trong bài viết trước, bạn đã tạo một ứng dụng MVC cho phép lưu trữ và hiển thị dữ liệu dùng Entity Framework và SQL Server Compact. Trong phần này bạn sẽ xem lại và tùy biến các câu lệnh cho phép xem, thêm, xóa, sửa dữ liệu mà trình hỗ trợ của MVC đã tự động tạo cho bạn trong các view và controller.

Ghi chú: Trong thực tế, người ta thường dùng mẫu thiết kế Repository để tạo lớp trừu tượng giữa controller và DAL. Để giữ cho bài viết được đơn giản, bạn sẽ không xây dựng một repository cho tới các bài viết sau trong cùng loạt bài này.

(CRUD: Create, Read, Update, Delete)

Continue reading “Thực hiện các tính năng CRUD với Entity Framework trong ứng dụng ASP.NET MVC”

ASP.NET MVC Release Candidate 2 ra mắt

Bản ASP.NET MVC RC2 đã được giới thiệu hôm 03/03, trong bài này tôi sẽ nói sơ qua những thay đổi của phiên bản này so với phiên bản trước.

Có 3 thay đổi chính bao gồm.

  • Bản cài đặt yêu cầu .NET 3.5 SP1
  • Vẫn có thể triển khai bằng cách đưa các thư viện vào trong thư mục bin nếu dùng .NET 3.5 (không có SP1): khi cài ASP.NET MVC, các thư viện System.Web.Mvc, System.Web.Routing, System.Web.Abstractions sẽ được thêm vào GAC trên máy cài đặt. Điều này sẽ không gây ra vấn đề gì nếu bạn đang cài đặt và chạy ASP.NET MVC trên cùng một máy. Tuy nhiên, nếu bạn định triển khai lên một máy khác có thể sẽ gặp trục trặc nếu máy đó chưa được cài sẵn ASP.NET MVC. Bạn có thể giải quyết vấn đề bằng cách đưa các thư viện này vào thư mục bin của ứng dụng. Nếu dùng cách này, máy chủ của bạn chỉ cần .NET 3.5 (không có SP1) vẫn có thể chạy được.
  • Chế độ chỉ cài đặt cho server: Trong bản cài đặt này, bạn có thể cài ASP.NET MVC lên máy tính không có Visual Studio, trong trường hợp đó, bộ cài đặt sẽ không cài đặt các template cho VS, các thư viện sẽ vẫn được cài đặt vào GAC và các native image vẫn được tạo.

Bạn có thể tải về bản ASP.NET MVC RC2 tại đây.

Mã nguồn có thể tải về tại đây.