05/11/2013

Giới thiệu ASP.NET MVC Framework

Đây là bài dịch từ một số bài blog của tác giả Scott Guthrie về ASP.NET MVC Framework  về một công nghệ mới ra đời của ASP.NET.

Một hạn chế của framework ASP.NET từ trước đến nay là không hỗ trợ các lập trình viên sử dụng kiến trúc MVC để phát triển các ứng dụng, và nhiều người vẫn đang mong chờ sự xuất hiện của kiến trúc lâu năm này trong bộ framework.
Tại hội nghị Alt.NET ở Austin, tôi đã có một bài thuyết minh về một framework MVC mới cho ASP.NET mà nhóm của chúng tôi đang thực hiện. Bạn có thể xem đoạn video về bài thuyết trình của tôi ở trang nhật ký của Scott Hanselman http://www.hanselman.com/blog/ScottGuMVCPresentationAndScottHaScreencastFromALTNETConference.aspx
Chúng tôi sẽ phát hành bản preview của framework MVC ASP.NET cho mọi người vào cuối năm nay. Dự kiến chúng tôi sẽ cho ra đời bản chính thức và được hỗ trợ đầy đủ vào nửa đầu của năm 2009.

Model View Controller (MVC) là gì

MCV là tên một phương pháp chia nhỏ một ứng dụng thành ba thành phần để cài đặt, mỗi thành phần đóng một vai trò khác nhau và ảnh hưởng lẫn nhau, đó là models, views, và controllers.
   1.      Models trong các ứng dụng dựa trên MVC là những thành phần có nhiệm vụ lưu trữ thông tin, trạng thái của các đối tượng, thông thường nó là một lớp được ánh xạ từ một bảng trong CSDL. Lấy ví dụ, chúng ta có lớp Product được sử dụng để mô tả dữ liệu từ bảng Products trong SQL, bao gồm ProductID, OrderDate...
   2.      Còn đối với Views, nó chính là các thành phần chịu trách nhiệm hiển thị các thông tin lên cho người dùng thông qua giao diện. Thông thường, các thông tin cần hiển thị được lấy từ thành phần Models. Ví dụ, đối tượng Product có một "Edit" view bao gồm các textboxes, các dropdowns và checkboxes để chỉnh sửa các thuộc tính của sản phẩm; có một "Display" view gồm 2 dòng, cột dòng là ProductID, dòng sau là OrderDate... để xem thông tin về sản phẩm.
   3.      Cuối cùng, Controllers trong các ứng dụng kiểu MVC chịu trách nhiệm xử lý các tác động về mặt giao diện, các thao tác đối với models, và cuối cùng là chọn một view thích hợp để hiển thị ra màn hình. Trong kiến trúc MVC, view chỉ có tác dụng hiển thị giao diện mà thôi, còn điều kiển dòng nhập xuất của người dùng vẫn do Controllers đảm trách.
Một lợi điểm của phương pháp MVC là nó bắt buộc phải tạo ra một sự rành mạch trong liên kết giữa 3 thành phần models, views và controllers trong ứng dụng. Duy trì được mối quan hệ rành mạch rõ ràng này khiến việc kiểm tra ứng dụng trở nên dễ dàng hơn, đồng thời trách nhiệm của từng thành phần được định nghĩa rõ ràng và cả ba đều làm việc ăn ý với nhau.
Pattern MVC cũng cho phép thực hiện red/green test driven development (TDD) (http://en.wikipedia.org/wiki/Test-driven_development), cài đặt các unit tests tự động, xác định và kiểm tra lại các yêu cầu trước khi bắt tay vào viết code.
*** Test-Driven Development (TDD) is a software development technique consisting of short iterations where new test cases covering the desired improvement or new functionality are written first, then the production code necessary to pass the tests is implemented, and finally the software is refactored to accommodate changes.
Một vài chi tiết mà tôi có thể hé lộ vào thời điểm hiện tại, đó là:
- Cho phép sự chia tách rành mạch giữa các thành phần, mỗi thành phần đều có khả năng được test riêng biệt và mặc định hỗ trợ TDD. Tất cả các mối liên hệ chính yếu trong MVC đều có giao diện để hiển thị và đều có thể xây dựng thành các mô hình, và bao gồm interface-based IHttpRequest/IHttpResponse. Bạn có thể chạy unit test cho ứng dụng mà không phải chạy các Controllers trong ASP.NET process, điều này làm unit test chạy nhanh hơn. Bạn có thể sử dụng unit testing framework nào cũng được, kể cả NUnit, MBUnit, MS Test...
- Được thiết kế để có thể dễ mở rộng và tiện dụng, tất cả mọi thứ trong MVC framework đều có thể nhanh chóng được thay đổi, tùy chọn hóa. Ví dụ bạn có thể viết một View và sử dụng cho nhiều ứng dụng khác nhau, đây là tính pluggable.
- Bao gồm thành phần ánh xạ URL cho phép bạn xây dựng các ứng dụng thân thiện với bộ máy tìm kiếm và với người dùng. Lấy ví dụ tôi có thể ánh xạ URL /products/edit/4 là một trang cho phép chỉnh sửa thông tin về các sản phẩm, hoặc là /Blogs/scottgu/10-10-2007/SomeTopic/  để xem các thông tin.
- MVC framework hỗ trợ sử dụng các các tập tin .ASPX, .ASCX.Master như là thành phần View, điều đó có nghĩa là bạn vẫn có thể sử dụng các tính năng của ASP.NET như master pages, <%= %> snippets, server controls, templates, data-binding, localization... Tuy nhiên nó không sử dụng mô hình post-back từ giao diện gửi đến server nữa, thay vào đó, bạn có thể chủ động đưa những post-back từ giao diện đó đến thẳng lớp Controller. Tóm lại, không còn viewstate hay là page lifecycle còn tồn tại trong mô hình MVC.
- Vẫn tiếp tục hỗ trợ các tính năng ASP.NET như là forms/windows authentication, URL authorization, membership/roles, output and data caching, session/profile state management, health monitoring, configuration system, the provider architecture...
Nếu bạn đang tìm kiếm một phương pháp xây dựng các ứng dụng web theo hướng MVC, tôi nghĩ ASP.NET MVC Framework mới ra này sẽ là một lựa chọn tốt, rất rành mạch và dễ sử dụng. Nó cho phép bạn dễ dàng bảo trì sự phân tách giữa các thành phần trong ứng dụng, đồng thời cũng rất tốt trong công việc testing và TDD.
Tôi sẽ viết nhiều bài hướng dẫn hơn trong những tuần sắp đến để mô tả cách thức làm việc của MVC, để cho bạn có thể nhận ra những ưu điểm và thuận lợi khi sử dụng công nghệ này.

Một ứng dụng cửa hàng thương mại điện tử đơn giản

Tôi sẽ sử dụng một ứng dụng cửa hàng thương mại điện tử để minh họa cái cách mà ASP.NET MVC Framework làm việc. Bài viết hôm nay tôi  sẽ cài đặt một hệ thống liệt kê và tìm duyệt các sản phẩm có trong cửa hàng.
Cụ thể, chúng đang đang xây dựng hệ thống cho phép người dùng cuối tìm duyệt danh sách các catalog khi họ đến thăm trang /Products/Categories:

Khi người dùng click vào một đường link catalog như hình ở trên, họ sẽ được chuyển tới trang hiển thị các sản phẩm có trong một danh mục cụ thể, đó là trang /Products/List/CategoryName:

Khi người dùng click vào một sản phẩm, họ được chuyển đến trang mô tả thông tin chi tiết về sản phẩm đó, /Products/Detail/ProductID:

Chúng ta sẽ xây dựng tất cả các tính năng trên bằng cách sử dụng ASP.NET MVC framework. Xin nhắc lại một lần nữa, sự phân biệt rõ ràng giữa các thành phần trong ứng dụng, khả năng unit test và TDD là những điều tạo ra sự khác biệt mà chúng ta đặc biệt nhấn mạnh.
Tạo mới một ứng dụng ASP.NET MVC
Visual Studio Project Templates được đi kèm với MVC Framework, cho phép tạo một ứng dụng web theo template cho sẵn. Đơn giản, bạn chỉ cần vào File -> New Project và chọn template "ASP.NET MVC Web Application" và tạo một web mới.
Mặc định khi sử dụng template này, Visual Studio sẽ tạo một solution mới bao gồm hai projects con. Project đầu tiên là web project nơi mà bạn sẽ cài đặt ứng dụng. Project thứ hai là testing project mà bạn dùng để test project thứ nhất:
Bạn có thể sử dụng bất kỳ unit testing nào, bao gồm NUnit, MBUnit, MSTest, XUnit... trong ASP.NET MVC. Visual Studio 2008 đã cài đặt sẵn testing project hỗ trợ MSTest (trong VS 2005 chỉ có Visual Studio Team System SKU mới có), và testing project này được tự động tạo ra khi bạn sử dụng template MVC project.
Trong tương lai chúng tôi cũng sẽ thêm vào các testing project dành cho NUnit, MBUnit và các testing framework khác, để cho bạn có thêm nhiều lựu chọn khi tạo một ứng dụng web và có ngay một testing project mà bạn thích để sử dụng.
Hiểu rõ cấu trúc thư mục trong Project
Cấu trúc thư mục mặc định của ứng dụng ASP.NET MVC gồm 3 thư mục chính:
    * /Controllers
    * /Models
    * /Views
Như bạn thấy, chúng tôi khuyến khích việc đưa những class điều khiển vào bên trong thư mục /Controllers, những class thuộc về mô hình dữ liệu vào bên trong thư mục /Models, và những gì liên quan đến giao diện vào thư mục /Views.
Mặc dù ASP.NET MVC framework không bắt buộc bạn phải luôn sử dụng cấu trúc này, nhưng đây là cấu trúc mặc định khi bạn tạo một project mới và chúng tôi luôn luôn khuyến khích việc sử dụng nó để phân chia ứng dụng. Bạn hãy sử dụng cấu trúc này ngoại trừ trường hợp bạn đề ra một lý do đủ thuyết phục để thay đổi nó.
Ánh xạ các URL vào trong class Controller
Hầu hết các web framework, như ASP, PHP, JSP, ASP.NET WebForms..., đều ánh xạ các URL vào một file template được lưu trên đĩa. Lấy ví dụ URL "/Products.aspx" hay "/Products.php" được chuyển đến file template Products.aspx hay Products.php trên đĩa cứng để xử lý. Khi một ứng dụng web nhận được HTTP Request đến web server, thì web framework sẽ chạy đoạn một code cụ thể tương ứng với nội dung của file template, và đoạn code này đóng vai trò xử lý yêu cầu do phía client gửi đến. Thông thường thì đoạn code này sẽ sinh ra HTML và đáp ứng lại phía client.
MVC Framework lại hoạt động theo một cách khác hoàn toàn, thay vì ánh xạ các URL vào các file template lưu trên đĩa, nó sẽ đưa thẳng vào các class. Những class được ánh xạ tới được gọi là "Controllers", và chúng sẽ xử lý request đến, kiểm soát dòng nhập xuất và giao diện đối với người dùng, thực thi các ứng dụng và data logic tương ứng với request. Cuối cùng, chúng sử dụng các thành phần Views để tạo HTML và đáp trả lại request.
ASP.NET MVC Framework có một bộ máy ánh xạ URL thật sự mạnh mẽ. Bộ máy này cung cấp phương pháp rất linh hoạt trong việc ánh xạ URLs sang cho Controller Classes. Bạn có thể dễ dàng định ra các quy luật, cài đặt đường đi để ASP.NET dựa vào các quy luật đường đi đó, xác định xem phải thực thi Controller nào. ASP.NET còn có khả năng phân tích URL, chuyển các thông số trong URL thành các tham số trong lời gọi hàm của Controller. Tôi sẽ viết kỹ hơn về kỹ thuật định tuyến nâng cao trong những bài blog sắp đến.
Đường đi mặc định từ ASP.NET MVC URL đến Controller Classes
Các projects ASP.NET MVC được định nghĩa sẵn một số quy luật về đường đi để bạn không phải hiệu chỉnh thêm điều gì trong khi bắt đầu làm quen với framework mới. Bạn có thể bắt đầu viết mã và sử dụng phương pháp ánh xạ URL mặc định được định nghỉa trong file Global.asax - ASP.NET Application class. File Global.asax này được tự động tạo ra từ ASP.NET MVC project template.
Phương pháp mặc định đơn giản làm nhiệm vụ ánh xạ một phần URL từ HTTP Request, lấy ví dụ /Products/, đến một class có tên theo mẫu UrlPathController, tức là URL /Products/ sẽ được chuyển đến class có tên là ProductsController.
Để xây dựng chức năng tìm duyệt sản phẩm trong ứng dụng thương mại điện tử, chúng ta thêm vào class "ProductsController" vào project. Bạn có thể sử dụng menu "Add New Item" để nhanh chóng tạo Controller class từ template:
Class ProductsController được kế thừa từ class cơ sở System.Web.MVC.Controller. Thừa kế từ class cơ sở này không phải là điều bắt buộc, tuy nhiên sẽ khá tiện lợi bởi nó có nhiều phương thức và chức năng mà ta muốn sử dụng về sau này.
Một khi chúng ta đã định nghĩa class ProductsController, ASP.NET MVC framework sẽ sử dụng nó cho tất cả các URL bắt đầu bằng "/Products/". ProductsController cũng sẽ được sử dụng bất kỳ khi nào có yêu cầu đến "/Products/Categories", "/Products/List/Beverages" và "/Products/Detail/3", là ba chức năng mà ta sẽ phải cài đặt trong ứng dụng cửa hàng này.
Trong phần tiếp theo tôi sẽ thêm ShoppingCartController để người dùng có thể quản lí giỏ hàng của họ. Thêm vào đó là AccountController cho phép người dùng tạo tài khoản khách hàng, đăng nhập và đăng xuất khỏi website. Tất nhiên khi đã có hai controller này rồi, thì mặc định các URL bắt đầu bằng /ShoppingCart//Account/ sẽ được tự động chuyển hướng sang controller để xứ lý.
Lưu ý: ASP.NET MVC framework không yêu cầu bạn bắt buộc phải sử dụng cách đặt tên để ánh xạ URL theo mẫu như trên. Lý do duy nhất mà ứng dụng tôi đang thực hiện làm như vậy là do nó sử dụng các luật ánh xạ mặc định được tạo bởi ASP.NET MVC Project template. Nếu bạn muốn thay đổi, bạn có thể chỉnh sửa lại các luật trong class ASP.NET Application - file Global.asax.

No comments:

Post a Comment