9/9/11

SubSonic Framework: Kiến trúc thế hệ mới trên .NET

SubSonic là gì?

SubSonic là một framework với rất nhiều công cụ giúp xây dựng kiến trúc dự án (đặc biệt các dự án web) một cách nhanh chóng, trong đó ý tưởng chính là tự động hóa công việc viết mã cho DAL.
Đặc điểm
• SubSonic giảm thời gian viết mã cho người phát triển.
• SubSonic gắn liền với "tự động hóa", được cài đặt để cập nhật thay đổi thiết kế của CSDL và tự động đồng bộ, cập nhật mã cho DAL, để người phát triển có thể tập trung vào những công việc sáng tạo khác.


• SubSonic sử dụng mô hình Entity làm nền tảng và không hỗ trợ DataSet.

• SubSonic thiết kế DAL dựa trên các mô hình nổi tiếng: "Provider Pattern" và "Active Record Pattern". Active Record là một pattern đặc biệt của Entity với 3 trạng thái đặc trưng: IsLoaded, IsNew và IsDirty. Ngoài ra, giữa các ActiveRecord có quan hệ liên kết với nhau giống như liên kết các bảng trong CSDL.
• Dựa vào ORM (Object Relational Mapping), SubSonic xây dựng ánh xạ giữa các Table/View/Stored Procedures với các đối tượng tạo nên DAL. Ngoài ra, SubSonic được thiết kế tương thích với nhiều hệ CSDL (MS SQL, MySQL, Oracle...).

Trước đây khi xây dựng DAL, chúng ta thường sử dụng DataSet hoặc Entity để trao đổi dữ liệu giữa các tầng với nhau. Các Entity hoặc DataSet là kết quả của phép ánh xạ các bảng CSDL (Table) với các đối tượng. Tuy nhiên việc xây dựng các ánh xạ như vậy thường rất vất vả cho các lập trình viên. Thời kỳ đó các công cụ thương mại như CodeSmidth... ra đời giúp các lập trình viên nhanh chóng tạo ra các đối tượng (Entity, DataSet...) từ các bảng. Tuy nhiên hạn chế của CodeSmidth là lập trình viên phải có kiến thức về ngôn ngữ script để định nghĩa ra các Template trước khi tạo ra Entity, DataSet hay một "Object Pattern" nào đó.
Kiến trúc
• Trung tâm của SubSonic framework là DAL Builder, có nhiệm vụ tạo ra một loạt các đối tượng (Model, Controller), nhờ đó giảm tối đa công sức viết mã. Tất cả các đối tượng được tạo ra bởi SubSonic đều được thiết kế theo kỹ thuật "strongly-typed" sao cho dữ liệu được quản lý an toàn và hiệu quả.

• Sau khi đã có các đối tượng được tạo ra từ DAL Builder, SubSonic hỗ trợ một Query Engine cho phép truy vấn dữ liệu động mà không cần phải viết mã truy vấn, nhờ đó giảm được thời gian cho những công việc lặp lại, nhàm chán (đặc biệt là đối với các CSDL lớn) để người phát triển có thể tập trung nhiều hơn vào các công việc sáng tạo khác.

• Bao quanh SubSonic là các tầng tiện ích, thư viện API và ngày càng được hoàn chỉnh với nhiều Control mới. Đáng kể nhất là "giàn giáo" (Scaffold) giúp thiết kế nhanh các trang Admin (xem chi tiết "Scaffold" ở phần cuối).

Cấu hình

Trước hết, chúng ta hãy mở Web.config (hoặc App.config cho dự án không phải web), thiết lập cấu hình cho SubSonic như sau:
Tiếp theo, thiết lập kết nối cơ sở dữ liệu:

Sau 2 bước trên, chúng ta sẽ định nghĩa các Provider, mỗi Provider được kết nối với một cơ sở dữ liệu:

SubsonicService >Trên đây là thông tin cơ bản nhất để bắt đầu làm việc với SubSonic. Thông tin này được sử dụng cho hai trường hợp:

• Kích hoạt SubSonic để sinh mã cho các object, scaffold... tại thời điểm biên dịch.

• Thực thi các tương tác với CSDL tại thời điểm chạy chương trình.
Query Engine

SubSonic cung cấp dịch vụ Query Engine cho phép tương tác dữ liệu thông qua một loạt các đối tượng và phương thức có sẵn.

Như đã nói ở trên, mỗi Provider thiết lập kết nối với một CSDL. Khi đang thực thi chương trình có thể chuyển đổi dễ dàng các Provider này. Đoạn mã thí dụ dưới đây sẽ chỉ ra cách thức SubSonic làm việc với CSDL như thế nào:

SubSonic.Query query1 = new SubSonic.Query("Products", "CommerceDataProvider"); //Tham số đầu tiên là tên bảng, tham số thứ hai là tên Provider sẽ được kết nối với SubSonic thông qua khai báo trong web.config.
query1.Schema = SubSonic.Query.BuildTableSchema("Products");
query1.WHERE("ProductName", SubSonic.Comparison.Equals, "BlackBerry");
DataSet ds = query1.ExecuteDataSet();
string debugInfo = query1.Inspect(); //Trả về HTML markups bao gồm các thông tin như thời gian thực thi truy vấn, kết quả truy vấn... Thông tin này rất có ích khi cần debug chương trình
Response.Write(debugInfo); //Cuối cùng, ghi thông tin cần debug ra màn hình
Để hiểu thêm về cách thức Query Engine hoạt động, bạn có thể bắt đầu với dự án đơn giản qua video trực tuyến tại địa chỉ: http://www.wekeroad.com/ss_setup2.html
Active Record Pattern

SubSonic sinh mã theo mô hình Active Record Pattern, tức là mỗi một Table hoặc View sẽ được ánh xạ vào một đối tượng (Active Record), đối tượng này tương tác với Table/View/SP thông qua các hàm chuẩn Load(), Save()... Xem thí dụ sau:

product = new Product()
product.Name = "Your product name"
product.Price = 123.45
product.Save()
Các đối tượng này còn đựơc gọi là "Wrapper Object".

Tất cả các đối tượng sinh ra từ SubSonic đều kế thừa ActiveRecord hoặc ActiveList (đối với các đối tượng dạng danh sách - Collection). SubSonic đưa vào ActiveRecord tất cả các phương thức chuẩn, bao gồm: Save(), Delete(), Destroy(), FetchAll(), FetchByParameter()...
SubSonic sinh mã như thế nào?

Có rất nhiều cách sinh mã trong SubSonic, bạn có thể sử dụng một trong các cách sau:
• Command-line: Trực tiếp trên MS Dos hoặc chạy tệp batch. Một cách khác là mở External Tools trong IDE và đặt đường dẫn đến SubSonic, sau đó kéo vào Toolbar như dưới đây:

Trên toolbar có thể thấy 4 chức năng được bổ sung, gồm chức năng tạo DAL, chức năng thiết kế Scaffold (xem chi tiết "Scaffold" ở phần cuối bài viết) và hai chức năng liên quan đến Database Migration hay DB Versioning (quản lý phiên bản cơ sở dữ liệu).

• Macro: Tích hợp SubSonic với Visual Studio 2005. Với macro, bạn có thể tạo ra DAL chỉ với một lần click chuột.

• SubSonic Add-in, SubSonic Custom Tool: Có thể tích hợp SubSonic vào Visual Studio 2005 như một Add-in hoặc Custom Tool.
• SubStage: Đây là một chương trình khá mạnh có thể tạo ra tất cả những gì bạn muốn, bao gồm cả thông tin về Web.config và mã chương trình như Object Wrapper (Model, Controller), Scaffold... Bạn sẽ không phải làm gì cả ngoại trừ "copy/paste" mã vừa tạo ra vào dự án của bạn (xem thêm phần SubStage ở phần cuối)
Partial Class

SubSonic được xây dựng trên .NET 2.0 trở đi, do đó sẽ không phải lo lắng liệu có thể viết đè lên các đối tượng được SubSonic tạo ra, vì .NET phiên bản 2.0 trở đi hỗ trợ việc xây dựng các đối tượng mở rộng (Partial). Mỗi "Wrapper Object" sẽ có 2 phần, một phần do SubSonic tạo ra, phần còn lại (partial class) là nơi bổ sung các đoạn mã mới mà không ảnh hưởng đến hoạt động của toàn bộ hệ thống.
Audit Field

Trong các thiết kế CSDL ngày nay, các trường Audit Field có mặt gần như khắp mọi nơi. Audit Field làm tăng dữ liệu dư thừa nhưng hiệu quả đem lại thì không thể không tính đến, đó là đẩy mạnh tốc độ xử lý của ứng dụng và đảm bảo an toàn dữ liệu. Có thể nhận thấy rõ nhất điều này khi sử dụng Audit Field để xử lý các vấn đề xung đột khi có nhiều người cập nhật cùng một dữ liệu.

SubSonic tận dụng khả năng đem lại của Audit Field và đưa ra thiết kế chuẩn cho các trường Audit Field như sau:
public class ReservedColumnName
{
public const string CREATED_BY = "CreatedBy";
public const string CREATED_ON = "CreatedOn";
public const string DELETED = "Deleted";
public const string IS_ACTIVE = "IsActive";
public const string IS_DELETED = "IsDeleted";
public const string MODIFIED_BY = "ModifiedBy";
public const string MODIFIED_ON = "ModifiedOn";
}

SubSonic khuyến nghị các bảng CSDL nên được thiết kế với các trường dành riêng này. Vậy SubSonic xử lý các trường Audit Field như thế nào?

Lấy thí dụ về trường "IsDeleted", khi bạn gọi lệnh xóa một bản ghi (phương thức Delete() của ActiveRecord), SubSonic sẽ không xóa bản ghi hoàn toàn ra khỏi database, mà sẽ đánh dấu bản ghi này bằng cách gán giá trị IsDeleted = True. Nếu muốn xóahoàn toàn bản ghi này ra khỏi database, phương thức Destroy() sẽ thực hiện điều đó.
So sánh SubSonic với NHibernate

NHibernate không tự sinh ra mã mà cần đến các chương trình bên ngoài (thí dụ CodeSmidth) định nghĩa template cho NHibernate trước khi sinh mã. Ngược lại SubSonic tự động hoá hoàn toàn và có thể cho phép sửa đổi template theo ý muốn. Hơn nữa SubSonic là một dự án nguồn mở hoàn toàn miễn phí và Microsoft dự kiến sẽ tích hợp SubSonic như một thành phần trong bộ công cụ .NET Studio.

So với các framework khác như Hibernate, LINQ... thì SubSonic dễ cấu hình hơn và có kiến trúc đơn giản, ổn định. Chính vì lý do đó mà SubSonic được xem như "framework nhẹ”.
SubSonic + ASP.MVC: Sự kết hợp kiến trúc trên nền .NET
SubSonic dựa trên MVC và MVC vận dụng SubSonic để xây dựng tầng DAL. Đó là một mối quan hệ khăng khít giữa MVC và SubSonic.

Model: Theo định nghĩa của MVC thì Model sẽ quản lý thông tin và thông báo cho các Observer khi thông tin đó thay đổi. Lợi dụng đặc điểm này, SubSonic xây dựng các Model trong đó thiết lập ánh xạ với các Table/View. Các thuộc tính cơ bản của ActiveRecord là: IsLoaded, IsNew, IsDirty sẽ nói lên trạng thái của thông tin được thay đổi ra sao.

Controller: Trong mô hình MVC, Controller chịu trách nhiệm kết nối các tương tác người dùng với phản hồi của ứng dụng. Controller nhận đầu vào từ View và điều khiển Model để thực hiện các tác vụ tương ứng. Controller kết nối các Model khác nhau và quản lý nguồn dữ liệu của các Model đó (do đó còn gọi là Object Data Source Controller). Cũng như Model, với mỗi Table/View, SubSonic tự động tạo ra Controller tương ứng. Ngoài ra, Controller có thể được mở rộng (partial class) với các "business rule" đặc thù cho từng module.

Như vậy, đối với mỗi một Table/View, sẽ có 3 đối tượng được tự động tạo ra bởi SubSonic: Hai đối tượng Model (một kế thừa ActiveRecord và một kế thừa ActiveList) và một đối tượng Controller.
ASP.NET MVC Web Application Template
Microsoft cung cấp hẳn một template dành riêng cho các dự án theo kiến trúc MVC (có thể vào website của Microsoft để tải về MVC Template). Lưu ý, bất kỳ dự án nào không phải MVC vẫn có thể tích hợp được SubSonic. Tuy nhiên việc xây dựng dự án dựa trên MVC Template có thuận lợi là bạn không phải quan tâm đến toàn bộ kiến trúc của dự án, việc duy nhất bạn phải làm là khởi động SubSonic.
Các bạn có thể tải về video hướng dẫn chi tiết cách thức tích hợp SubSonic với MVC Template tại địa chỉ: http://silverlight.services.live.com...ntro/video.wmv
Scaffold: Giàn giáo trong xây dựng phần mềm

Giả sử bạn có tới 50 bảng CSDL và các lập trình viên (LTV), kiểm tra viên (KTV) thường xuyên thao tác với dữ liệu các bảng này để kiểm tra công việc của họ. Tuy nhiên bạn không muốn LTV và KTV thao tác dữ liệu trực tiếp trong CSDL vì nhiều rủi ro. Phương pháp an toàn nhất là dựng lên các giao diện "tạm" với đầy đủ các chức năng CRUD (Create, Read, Update, Delete) giống như một trang Admin để bất cứ ai cũng có thể thay đổi được. Tuy nhiên việc xây dựng 50 trang tạm như thế làm tốn thời gian và công sức. Thuật ngữ "Scaffold" ra đời để tái hiện các trang tạm đó giống như các "giàn giáo" trong ngành xây dựng, giúp các LTV, KTV đẩy mạnh tiến độ dự án. Và khi dự án kết thúc, các giàn giáo đó sẽ được gỡ bỏ và rất có thể, một số trong số đó được giữ lại hoặc thậm chí nâng cấp thành các trang Admin.
Một đặc điểm dễ thấy của Scaffold là, không giống như các trang tương tác trực tiếp với khách hàng, các trang Admin không có yêu cầu quá cao về giao diện vì chỉ hoạt động chủ yếu ở "hậu trường", do đó thiết kế cũng rất đơn giản, sơ sài. Ban đầu Scaffold chỉ được sử dụng cho nội bộ nhóm các LTV và KTV trong suốt quá trình phát triển dự án, về sau các phiên bản mới của các framework đều ra sức phát triển công cụ đi kèm để nâng cấp Scaffold thành các trang Admin hoàn thiện hơn về mặt giao diện lẫn chức năng để bất cứ người dùng nào (có quyền) cũng đều có thể truy cập được như người quản trị hệ thống, những người quản lý...

Hiện nay các framework lớn như Ruby-On-Rails, MonoRail... đều cung cấp Scaffold giúp đẩy mạnh xây dựng các trang Admin. Đặc biệt với Scaffold trong SubSonic, bạn không cần phải viết một dòng mã nào.

Ngoài các chức năng cơ bản CRUD, SubSonic còn trang bị cho Scaffold các control tiện dụng như: GridView, Paging, Calendar, DropDown...

Scaffold trong SubSonic rất đa đạng và được phân loại như sau:

• QuickTable: Hiển thị toàn bộ dữ liệu của một bảng trên GridView, không có đầy đủ CRUD. Đây là control đơn giản nhất của SubSonic.

• Các User Control thành phần bao gồm: DropDown, CalendarControl, ManyManyList, RadioButtons.

• Scaffold: Có đầy đủ CRUD và chứa tất cả các control thành phần của SubSonic.
Bạn có thể kéo thả Scaffold vào giao diện tùy theo mục đích sử dụng, thí dụ nếu muốn tương tác với dữ liệu của bảng Orders trên GridView thì có thể viết trên ASP.NET như sau:Control này sẽ vẽ một bảng chứa toàn bộ dữ liệu của Orders và thiết lập trang soạn thảo (Editor) cho các chức năng Create, Update, Delete.
Chú ý: Đối với các bảng nối (Associate Table), SubSonic bổ sung control có tên là "Many-To-Many" vào Scaffold, nhờ đó người dùng có thể nhập dữ liệu vào bảng nối một cách dễ dàng. Thí dụ bảng OrderDetails trong CSDL của Northwind sẽ là bảng nối của hai bảng Order và Product.
SubStage

SubSonic có thể tự động thiết kế toàn bộ các trang Admin, có nghĩa là bạn không phải mất một giây nào để làm điều đó. SubSonic cung cấp một chương trình quản lý với giao diện trực quan có tên là SubStage với hai chức năng chính: quản lý thông tin cấu hình và sinh mã cho DAL (bao gồm cả mã cho Scaffold). Tất cả những gì bạn phải làm chỉ là chọn Database, Provider và Table mà bạn sẽ tương tác.
Có thể tải về video hướng dẫn sử dụng SubStage tại địa chỉ: http://subsonicproject.com/2-1-pakala/using-substage/

Trước khi bước sang phần tiếp theo, hãy cùng tổng kết lại những gì SubSonic có thể tạo ra:

• DAL:
- "Active Record Wrapper" cho Table, View và SP
- Strongly Typed Collection classes
- Object Data Source Controllers

• Source code (SubSonic config, Scaffold...)
Thư viện hàm tiện ích

Bên cạnh Scaffold và User Control, SubSonic còn cung cấp một thư viện khá lớn bao gồm các hàm xử lý ngày-tháng nâng cao, các hàm xử lý file nâng cao, các hàm xử lý string/number/validation, các hàm thao tác web (thí dụ như mở/đọc trang web, thực hiện DNS Lookup...)
Ứng dụng của SubSonic

SubSonic ngày càng được sử dụng rộng rãi và được xem là framework tốt nhất để xây dựng DAL. Có thể kể đến một số phần mềm nguồn mở cũng như nguồn đóng như:

• DashCommerce (www.dashcommerce.com)

• Commerce for Umbraco: http://www.codeplex.com/commerce4umbraco

• Club Starter Kit: http://www.codeplex.com/ClubStarterKit

• DotNetKick: http://www.dotnetkicks.com

• FranchiseBlast: http://www.lavablast.com/en/lb_franchiseblast.aspx

Các nhà phát triển DotNetNuke (hay DNN, framework nổi tiếng cho Portal trên nền .NET) cũng đang tích hợp SubSonic vào một số module và có thể trong tương lai gần sẽ tích hợp SubSonic vào toàn bộ DNN.
Đới với những người mới bắt đầu tìm hiểu SubSonic, có thể tham khảo một trong hai gói ứng dụng đơn giản nhất:
• "SubSonic Starter Site", tải về tại địa chỉ:
• "Blog Engine":
Xin giới thiệu thêm một video trình bày về "SubSonic Starter Site" tại địa chỉ:
Bookmark and Share

0 comments:

Post a Comment

Next previous home

Cộng đồng yêu thiết kế Việt Nam Thiet ke website, danang