YOMEDIA
ADSENSE
Hiện thực lớp Business Logic
86
lượt xem 13
download
lượt xem 13
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
Hiện thực lớp Business Logic đòi hỏi bạn phải nắm rõ các business logic c ủa ứng d ụng. Ví d ụ đối với ứng dụng tin tức của chúng ta thì khi tạo m ột chuyên m ục m ới, b ạn ph ải ki ểm tra xem...
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Hiện thực lớp Business Logic
- Hiện thực lớp Business Logic đòi hỏi bạn phải nắm rõ các business logic c ủa ứng d ụng. Ví d ụ đối với ứng dụng tin tức của chúng ta thì khi tạo m ột chuyên m ục m ới, b ạn ph ải ki ểm tra xem KeyName của chuyên mục đó đã có trong hệ thống ch ưa? Nếu có r ồi thì ph ải báo l ỗi, và n ếu chưa có thì chúng ta kiểm tra KeyName đó có h ợp l ệ hay không? (Ch ỉ ch ứa kí t ự alphabet, ch ữ số, gạch dưới gạch và ngang...). public static void CreateCategory(Category category) { // Has this key name existed? if (!CheckKey(category.KeyName)) throw new BusinessException(String.Format(Resources.Strings.KeyNameExisted, category.KeyName)); // is this key name valid? if (!ValidateKey(category.KeyName)) throw new BusinessException(String.Format(Resources.Strings.InvalidKeyName, category.KeyName)); // ok , now save it to database CategoryDAO categoryDAO = new CategoryDAO(); categoryDAO.CreateCategory(category); } Trong phát triển ứng dụng, để dễ quản lý các thành phần của h ệ th ống, cũng nh ư không b ị ảnh hưởng bởi các thay đổi, người ta hay nhóm các thành ph ần có cùng ch ức năng l ại v ới nhau và phân chia trách nhiệm cho từng nhóm để công việc không bị ch ồng chéo và ảnh h ưởng l ẫn nhau. Ví dụ trong một công ty bạn có t ừng phòng ban, m ỗi phòng ban s ẽ ch ịu trách nhi ệm m ột công việc cụ thể nào đó, phòng này không được can thiệp vào công vi ệc nội b ộ c ủa phòng kia như Phòng tài chính thì chỉ phát lương, còn chuyện lấy tiền đâu phát cho các anh phòng Marketing thì các anh không cần biết. Trong phát tri ển ph ần mềm, ng ười ta cũng áp d ụng cách phân chia chức năng này. Bạn sẽ nghe nói đến thuật ngữ kiến trúc đa t ầng/nhi ều l ớp, m ỗi l ớp s ẽ thực hiện một chức năng nào đó, trong đó mô hình 3 l ớp là ph ổ bi ến nh ất. 3 l ớp này là gì? Là Presentation, Business Logic, và Data Access. Các l ớp này s ẽ giao ti ếp v ới nhau thông qua các dịch vụ(services) mà mỗi lớp cung cấp để t ạo nên ứng dụng, lớp này cũng không c ần bi ết bên trong lớp kia làm gì mà chỉ cần biết lớp kia cung cấp dịch vụ gì cho mình và s ử d ụng nó mà thôi.
- Lưu ý: Các bạn không nên nhầm lẫn khái niệm lớp(layer) trong ph ần này v ới khái niệm lớp(class) của các ngôn ngữ lập trình hướng đối tượng. Presentation Layer Lớp này làm nhiệm vụ giao tiếp với người dùng cuối để thu thập d ữ li ệu và hi ển th ị k ết qu ả/d ữ liệu thông qua các thành phần trong giao diện người s ử d ụng. Lớp này s ẽ s ử d ụng các d ịch v ụ do lớp Business Logic cung cấp. Trong .NET thì bạn có thể dùng Windows Forms, ASP.NET hay Mobile Forms để hiện thực lớp này. Trong lớp này có 2 thành phần chính là User Interface Components và User Interface Process Components. UI Components là những phần tử chịu trách nhiệm thu th ập và hi ển thị thông tin cho ng ười dùng cuối. Trong ASP.NET thì những thành phần này có thể là các TextBox, các Button, DataGrid... UI Process Components: là thành phần chịu trách nhiệm quản lý các qui trình chuy ển đ ổi gi ữa các UI Components. Ví dụ chịu trách nhiệm quản lý các màn hình nh ập d ữ li ệu trong m ột lo ạt các thao tác định trước như các bước trong một Wizard... Lưu ý : lớp này không nên sử dụng trực tiếp các dịch v ụ c ủa l ớp Data Access mà nên s ử d ụng thông qua các dịch vụ của lớp Business Logic vì khi b ạn s ử d ụng tr ực tiếp nh ư v ậy, b ạn có th ể bỏ qua các ràng buộc, các logic nghiệp vụ mà ứng dụng cần ph ải có.
- Business Logic Layer Lớp này thực hiện các nghiệp vụ chính của hệ thống, sử d ụng các dịch v ụ do l ớp Data Access cung cấp, và cung cấp các dịch vụ cho lớp Presentation. Lớp này cũng có th ể s ử d ụng các d ịch vụ của các nhà cung cấp thứ 3 (3rd parties) để thực hiện công vi ệc của mình(ví d ụ nh ư s ử d ụng dịch vụ của các cổng thanh tóan trực tuyến như VeriSign, Paypal...). Trong lớp này có các thành phần chính là Business Components, Business Entities và Service Interface. Service Interface là giao diện lập trình mà lớp này cung c ấp cho l ớp Presentation s ử d ụng. L ớp Presentation chỉ cần biết các dịch vụ thông qua giao diện này mà không c ần ph ải quan tâm đ ến lớp được hiện thực như thế bên trong này nào. Business Entities là những thực thể mô t ả những đối tượng thông tin mà h ệ th ống x ử lý. Trong ứng dụng chúng ta các đối tượng này là các chuyên m ục(Category) và b ản tin(News). Các business entities này cũng được dùng để trao đổi thông tin gi ữa l ớp Presentation và l ớp Data Access. Business Components là những thành phần chính thực hi ện các dịch v ụ mà Service Interface cung cấp, chịu trách nhiệm kiểm tra các ràng buộc logic(constraints), các qui t ắc nghi ệp vụ(business rules), sử dụng các dịch vụ bên ngoài khác để thực hi ện các yêu c ầu c ủa ứng dụng. Trong ứng dụng của chúng ta, lớp này sẽ chứa các thành ph ần là CategoryService và NewsService làm nhiệm vụ cung cấp các dịch vụ quản lý chuyên m ục và các b ản tin (thêm, xóa, sửa, xem chi tiết, lấy danh sách...). Data Access Layer Lớp này thực hiện các nghiệp vụ liên quan đến lưu trữ và truy xuất d ữ li ệu c ủa ứng d ụng. Thường lớp này sẽ sử dụng các dịch vụ của các hệ quản trị cơ s ở d ữ liệu nh ư SQL Server, Oracle,... để thực hiện nhiệm vụ của mình. Trong l ớp này có các thành ph ần chính là Data Access Logic, Data Sources, Servive Agents). Data Access Logic components (DALC) là thành phần chính ch ịu trách nhi ệm l ưu tr ữ vào và truy xuất dữ liệu từ các nguồn dữ liệu - Data Sources như RDMBS, XML, File systems.... Trong .NET Các DALC này thường được hiện thực bằng cách sử dụng thư vi ện ADO.NET để giao ti ếp v ới các hệ cơ sở dữ liệu hoặc sử dụng các O/R Mapping Frameworks đ ể thực hi ện vi ệc ánh x ạ các đối tượng trong bộ nhớ thành dữ liệu lưu trữ trong CSDL. Chúng ta s ẽ tìm hi ểu các th ư vi ện O/R một viết Mapping này trong bài khác. Service Agents là những thành phần trợ giúp vi ệc truy xuất các d ịch v ụ bên ngòai m ột cách d ễ đơn giản như xuất dịch vụ nội t ại. dàng và truy các Chúng ta đã tìm hiểu qua các lớp của mô hình 3 l ớp. Lý thuy ết h ơi nhi ều m ột chút có th ể làm bạn khó hiểu vì khả năng trình bày có hạn, nên bây gi ờ thử tìm hi ểu m ột qui trình c ụ th ể h ơn đ ể biết các lớp này giao tiếp với nhau như thế nào. Ví d ụ trong ứng d ụng c ủa chúng ta có thao tác tạo một chuyên mục mới, thì các lớp sẽ lt ương tác với nhau nh ư sau: Lớp Presentation - Trình bày một web form, có các text box cho phép ng ười s ử d ụng nh ập tên và mô t ả cho mục chuyên - Khi người dùng nhấn nút tạo trên form này, ứng d ụng sẽ th ực hi ện vi ệc t ạo m ột Business mới như đoạn họa: Entity Category code sau minh
- public void CreateNewCategory() { Category category = new Category(); category.Name = name.Text; category.Description = description.Text; // sử dụng dịch vụ do lớp Business cấp để t ạo mục cung chuyên CategoryService.CreateCategory(category); } Lớp Business Logic Để cung cấp dịch vụ tạo một chuyên mục, thành phần CategoryService s ẽ cung cấp hàm sau: public static void CreateCategory(Category category) { kiểm của mục tồn t ại ch ưa? // tra xem tên khóa chuyên đã ... kiểm của mục hợp lệ // tra tên khóa chuyên có không? ... // sử dụng DV của lớp Data Access để lưu chuyên mục m ới này vào CSDL CategoryDAO categoryDAO = new CategoryDAO(); categoryDAO.CreateCategory(category); } Lớp Data Access Tương tự, để cung cấp dịch vụ lưu một chuyên mục mới vào CSDL, thành ph ần CategoryDAO sẽ cung cấp hàm sau (sử dụng để kết nối với CSDL): ADO.NET public void CreateCategory(Category category) { tạo // connection ... tạo khởi tạo số... // command, các tham command.Parameters.Add(new SqlParameter("@KeyName", category.KeyName)); command.Parameters.Add(new SqlParameter("@Name", category.Name)); command.Parameters.Add(new SqlParameter("@Description", category.Description)); lưu dữ liệu // command.ExecuteNonQuery(); } thiết kế Phân tích và Ứng dụng của chúng ta sẽ viết bằng ASP.NET 2.0 và SQL Server 2000/2005. Ngôn ng ữ đ ược dùng là C#. Chúng ta đã tìm hiểu qua các thành phần chính trong mô hình 3 l ớp, gi ờ đ ến lúc b ắt tay vào thi ết kế các thành phần đó cho ứng dụng tin tức của chúng ta. Trong ứng d ụng tin t ức mà chúng ta đã tìm hiểu yêu cầu qua bài viết trước, chúng ta th ấy có hai đ ối t ượng thông tin chính mà chúng ta cần quản lý là các chuyên mục(category) và tin t ức(news). Ứng d ụng quản lý c ủa chúng ta s ẽ thu thập những đối tượng dữ liệu này t ừ người dùng(phóng viên, biên t ập viên) và trình bày l ại cho người sử dụng khác xem(độc giả). Giờ chúng ta bắt tay vào thi ết k ế các thành ph ần Business Entities. Business Entities
- Ứng dụng của sẽ gồm chúng ta bao 2 entity chính là Category và News. Trước hết là Category. Một chuyên mục (Category) sẽ gồm những thông tin sau: mục - sẽ được sinh tự động khi t ạo mới CategoryId: Mã chuyên mục. tế... Name: Tên chuyên VD: Vi tính, Kinh KeyName: Tên gợi nhớ dùng để phân biệt chuyên mục với nhau (không đ ược trùng nhau). VD với bạn sẽ thấy VNExpress có Vi-tinh, Suc-khoe... Description: Mô tả cho chuyên mục. VD: Description cho Vi-tinh là: thông tin m ới nh ất v ề công nghệ của Việt thế giới... thông tin Nam và ảnh đại diện mục Picture: Hình cho chuyên Trong ứng dụng đơn giản này, chúng ta chỉ thiết kế chuyên m ục có một c ấp, không có các chuyên mục con, cháu... Và ứng dụng này cũng không có ph ần quản lý các nhà biên t ập viên, nhà báo và cơ chế cấp quyền hạn duyệt bài, gửi bài...Tôi dành ph ần này cho các b ạn phát tri ển thêm, nhưng tôi cũng sẽ gợi ý cho các bạn cách thiết k ế trong ph ần m ở r ộng ứng d ụng. Tiếp Mỗi một bản sẽ theo là News. tin có các thông tin sau: bản Sẽ được tự động tạo mới. NewsId: mã tin. sinh khi Title: tiêu đề chính của bản tin. VD: Microsoft bố phá s ản! tuyên đề phụ của bản từ chức! Subtitle: tiêu tin. VD: Bill Gates phần giới thiệu ngắn gọn của bản Excerpt: tin Authors: danh sách tác giả bản tin. VD: Nguyễn Văn A, Hoàng Th ị B Keywords: danh sách từ khóa chính trong bản tin dùng đ ể tìm ki ếm. VD: Microsoft, broken phần nội của bản Body: Đây là dung chính tin. ảnh họa bản Picture: Hình minh cho tin. giờ tạo bản CreationTime: Ngày tin giờ chỉnh sửa cuối của bản LastModificationTime: Ngày cùng tin giờ bản được PublishedTime: Ngày tin đăng Tổng số lượt người bản TotalViews: xem tin Tổng số lượt người bản TotalRates: đánh giá tin Điểm của bản Rate: đánh giá trung bình tin Status: Trạng thái hiện tại của bản tin. Có thể là Writting(Đang vi ết), Approving(Đang ch ờ duyệt), Published(Đã được đăng) Business Service Components Bước tiếp theo chúng ta sẽ phân tích và thiết kế các Business Service Components. Các thành phần này sẽ làm nhiệm vụ chính cung cấp các dịch vụ cho lớp Presentation dùng đ ể l ấy và l ưu trữ thông tin. Lớp CategoryService Chúng ta cần những thao tách chính trên đối tượng d ữ li ệu Category: Tạo mới - CreateCategory(Category category) Cập nhật - UpdateCategory(Category category) Xóa - DeleteCategory(int categoryId) Lấy tiết thông tin chi - GetCategory(int categoryId) Lấy danh sách các category - GetCategories() Kiểm tra một Key xem có trong database chưa - CheckKey(string keyName). Thao tác này dùng để kiểm tra xem khi tạo mới một category thì KeyName đã t ồn t ại trong h ệ th ống ch ưa. Thao tác này có thể dùng trên lớp Presentation để kiểm tra và thông báo l ỗi cho ng ười dùng khi h ọ nh ập một hệ thống tên khóa đã có trong
- Lưu ý: Chúng ta sẽ thực hiện các business logic của hệ th ống trong l ớp này. Tương tự đối với lớp NewsService, dựa trên những gì yêu cầu chúng ta phân tích ở bài vi ết đ ầu tiên, chúng ta cần những thao tác chính sau đây trên đ ối t ượng News: Tạo mới - CreateNews(News news) Cập nhật - UpdateNews(News news) Xóa - DeleteNews(int newsId) Lấy tiết thông tin chi - GetNews(int newsId) Lấy danh sách các bản tin thuộc một chuyên m ục nào đó, s ắp x ếp theo tin m ới nh ất - GetNewsOfCategory(int categoryId, int page, int pageSize, out int totalRecords) Cập nhật số lần xem của một bản tin - UpdateTotalViews(int newsId) Cập nhật đánh giá cho một bản tin - UpdateRate(int newsId, int rate) Tìm bài viết dựa trên từ khóa - SearchNews(string keyWords, int page, int pageSize, out int totalRecords) Trong các hàm trên, các bạn chú ý đến hàm GetNewsOfCategory. Trong hàm này có các tham số dùng để phân trang các bản tin. Chúng ta cần đ ến ch ức năng này vì khi trình bày trên trang tin, chúng ta chỉ trình bày một số lượng có hạn các b ản tin c ủa m ột chuyên m ục nào đó ch ứ không thể trình bày tất cả trên màn hình được. Khi ng ười dùng mu ốn xem thêm, h ọ có th ể ch ọn trang tiếp theo hoặc nhấp vào link Xem ti ếp, lúc đó ứng d ụng s ẽ trình bày các b ản tin ở các trang tiếp theo. Tham số totalRecords cho chúng ta bi ết đ ược t ổng s ố b ản tin th ật s ự có trong chuyên mục đó. Lưu ý: Khi phân tích thiết kế ban đầu bạn không th ể nào hình dung đ ược h ết các yêu c ầu phát sinh để thiết kế trước các thao tác cần thi ết. B ạn phải c ập nh ật b ản thi ết k ế th ường xuyên đ ể phù hợp với yêu cầu. Bản thiết kế này vẫn còn thi ếu một s ố ch ức năng c ần thi ết mà tôi s ẽ trình bày cho các bạn trong bài viết tiếp theo, chúng ta s ẽ chỉnh s ửa b ản thi ết k ế này trong quá trình phát triển ứng dụng để phù hợp với các yêu cầu phát sinh mà chúng ta ch ưa nhìn th ấy h ết khi thiết kế. Data Access Components Bây giờ chúng ta sẽ thiết kế các lớp dùng để truy xuất và cập nh ật d ữ li ệu. Các hàm c ủa các l ớp DAO cũng khá đơn giản, chỉ làm nhiệm vụ cập nhật dữ li ệu vào database và truy xu ất d ữ li ệu t ừ database. Các bạn cũng thấy chức năng nó gi ống như trên l ớp Business Logic, nh ưng ở đây chúng ta không có bất kỳ ràng buộc logic gì, ch ỉ đ ơn gi ản th ực hi ện vi ệc truy xu ất d ữ li ệu mà được kiểm l ớp thôi. Các business logic đã tra trên Business Logic. Hiện thực lớp Business Logic & Data Access Sau khi đã xong bước thiết kế, chúng ta sẽ ti ến hành hi ện thực 2 l ớp Business và Data Access. Các bạn có thể xem source code đính kèm để biết chi tiết cách hi ện th ực 2 l ớp này nh ư th ế nào. Lớp Presentation sẽ được thiết kế và hiện thực trong bài viết ti ếp theo. Ph ần bên d ưới tôi s ẽ trình bày một số điểm chính trong cách hiện thực. Hiện thực Data Access Components Do ứng dụng của chúng ta đơn giản nên được giới hạn s ẽ dùng v ới CSDL SQL Server 2000/2005 nên lớp này không được thiết kế để chạy cùng lúc với nhi ều loại database khác nhau. Chúng ta sẽ dùng cái Stored Procedures để truy xuất d ữ li ệu an toàn và d ễ thay đ ổi h ơn, tránh bị các lỗi như SQL Injection(không thể tránh hoàn toàn nếu b ạn không hi ện th ực đúng). Các b ạn có thể xem qua một cách hiện thực một hàm cơ bản nh ư thế nào: public void CreateCategory(Category category)
- { using (SqlConnection connection = GetConnection()) { SqlCommand command = new SqlCommand("spCategoriesCreate", connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@KeyName", category.KeyName)); command.Parameters.Add(new SqlParameter("@Name", category.Name)); command.Parameters.Add(new SqlParameter("@Description", category.Description)); command.Parameters.Add(new SqlParameter("@Picture", category.Picture)); SqlParameter paramCategoryId = new SqlParameter("@CategoryId", SqlDbType.Int, 4); paramCategoryId.Direction = ParameterDirection.Output; command.Parameters.Add(paramCategoryId); connection.Open(); command.ExecuteNonQuery(); if (paramCategoryId.Value != DBNull.Value) category.CategoryId = (int)paramCategoryId.Value; else throw new DataAccessException(String.Format(Resources.Strings.CreateEntityException, "Category")); } } đơn giản được vi ết nh ư Stored Procedure spCategoriesCreate sau: CREATE PROCEDURE dbo.spCategoriesCreate @Name nvarchar(50), @KeyName varchar(30), @Description ntext, @Picture varchar(256), @CategoryId int output AS INSERT INTO Categories ( Name, KeyName, Description, Picture ) VALUES ( @Name, @KeyName, @Description, @Picture ) SELECT @CategoryId = SCOPE_IDENTITY() Hiện thực lớp Business Logic Hiện thực lớp Business Logic đòi hỏi bạn phải nắm rõ các business logic c ủa ứng d ụng. Ví d ụ đối với ứng dụng tin tức của chúng ta thì khi tạo m ột chuyên m ục m ới, b ạn ph ải ki ểm tra xem KeyName của chuyên mục đó đã có trong hệ thống ch ưa? Nếu có r ồi thì ph ải báo l ỗi, và n ếu chưa có thì chúng ta kiểm tra KeyName đó có h ợp l ệ hay không? (Ch ỉ ch ứa kí t ự alphabet, ch ữ
- số, gạch dưới gạch và ngang...). public static void CreateCategory(Category category) { // Has this key name existed? if (!CheckKey(category.KeyName)) throw new BusinessException(String.Format(Resources.Strings.KeyNameExisted, category.KeyName)); // is this key name valid? if (!ValidateKey(category.KeyName)) throw new BusinessException(String.Format(Resources.Strings.InvalidKeyName, category.KeyName)); // ok , now save it to database CategoryDAO categoryDAO = new CategoryDAO(); categoryDAO.CreateCategory(category); }
ADSENSE
CÓ THỂ BẠN MUỐN DOWNLOAD
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
ERROR:connection to 10.20.1.100:9315 failed (errno=111, msg=Connection refused)
ERROR:connection to 10.20.1.100:9315 failed (errno=111, msg=Connection refused)
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn