kiến trúc 3 layer

22
Kiến trúc 3 layer Ki ế n trúc 3 Layer: H ướ ng ti ế p c n c a ph n m m là chia nh ph n m n thành các t ng, m i t ng có vai trò đ c tr ư ng ri ê ng đ thu n ti n cho vi c dùng l i, s n sàng cho vi c m r ng h th ng,d b o trì, đ c bi t là d dàng trong vi c phân chia công vi c cho các thành viên trong nhóm…bao g m: + Presentation Layer(gui): t ng này đ giao ti ế p v i ng ườ i dùng đ thu th p d li u và hi n th k ế t qu thông qua giao di n, t ng này s d ng các d ch v do t ng business cung c p + Bussiness Layer(bus): t ng này đ x lý nghi p v chính c a h th ng s d ng các d ch v do t ng Data cung c p và cung c p các d ch v cho t ng Presentation + Datalayer(dao): t ng này ch u trách nhi m l ư u tr và x lý d li u nh ư (insert, update, delete, ) T t c các t ng này trao đ i d li u thông qua Data Transfer Object (dto) Lập trình theo Mô hình 3 lớp Đăng ngày: Chủ Nhật, 08/04/2012 12:00 AM Lượt xem: 2192 Khi bạn mới tiếp xúc với Windows Form và ADO.NET, việc lập trình bắt đầu trở lên phức tạp khi dự án lớn dần. Bởi vậy để 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. Một trong những mô hình lập trình như vậy đó là Mô hình 3 lớp (Three Layers). Trong bài viết này không tôi không tham vọng trình bày lại chi tiết mô hình thiết kế ứng dụng 3 lớp mà chỉ tóm tắt ngắn gọn lại những điểm chính của nó mà tôi đã nghiên cứu, tham khảo từ nhiều nguồn khác nhau. Sau đó tôi gửi tới các bạn một số Links, Book liên quan đến mô hình 3 lớp. Và ở cuối bài viết là Link download một ứng dụng tôi viết Demo theo mô hình 3 lớp với Windows Form và ADO.NET - Ứng dụng quản lý bán sách - BookShop.

Upload: lynh-lynh-candy

Post on 24-Jul-2015

441 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Kiến trúc 3 layer

Kiến trúc 3 layerKiến trúc 3 Layer: Hướng tiếp cận của phần mềm là chia nhỏ phần mền thành các tầng, mỗi tầng có vai trò đặc trưng riêng để thuận tiện cho việc dùng lại, sẵn sàng cho việc mở rộng hệ thống,dễ bảo trì, đặc biệt là dễ dàng trong việc phân chia công việc cho các thành viên trong nhóm…bao gồm:+ Presentation Layer(gui): tầng này để giao tiếp với người dùng để thu thập dữ liệu và hiển thị kết quả thông qua giao diện, tầng này sử dụng các dịch vụ do tầng business cung cấp+ Bussiness Layer(bus): tầng này để xử lý nghiệp vụ chính của hệ thống sử dụng các dịch vụ do tầng Data cung cấp và cung cấp các dịch vụ cho tầng Presentation+ Datalayer(dao): tầng này chịu trách nhiệm lưu trữ và xử lý dữ liệu như (insert, update, delete,…) Tất cả các tầng này trao đổi dữ liệu thông qua Data Transfer Object (dto)

Lập trình theo Mô hình 3 lớp

Đăng ngày: Chủ Nhật, 08/04/2012 12:00 AM

Lượt xem: 2192

Khi bạn mới tiếp xúc với Windows Form và ADO.NET, việc lập trình bắt đầu trở lên phức tạp khi dự án lớn dần. Bởi vậy để 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. Một trong những mô hình lập trình như vậy đó là Mô hình 3 lớp (Three Layers).

Trong bài viết này không tôi không tham vọng trình bày lại chi tiết mô hình thiết kế ứng dụng 3 lớp mà chỉ tóm tắt ngắn gọn lại những điểm chính của nó mà tôi đã nghiên cứu, tham khảo từ nhiều nguồn khác nhau. Sau đó tôi gửi tới các bạn một số Links, Book liên quan đến mô hình 3 lớp. Và ở cuối bài viết là Link download một ứng dụng tôi viết Demo theo mô hình 3 lớp với Windows Form và ADO.NET - Ứng dụng quản lý bán sách - BookShop.

Mô hình 3 lớp được cấu thành từ: Presentation Layers, Business Layers, và Data Layers. 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.

Page 2: Kiến trúc 3 layer
Page 3: Kiến trúc 3 layer

Kiến trúc mô hình 3 lớp

Bây giờ tôi sẽ mô tả tóm tắt về 3 lớp như sau:

1.    Presentation Layers

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.

Page 4: Kiến trúc 3 layer

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ó. Và hơn nữa nếu sử dụng như vậy thì đâu cần đến 3 lớp phải không bạn?

2.    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 để thực hiện công việc của mình.

Page 5: Kiến trúc 3 layer

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ớpPresentation 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 bên trong lớp này được hiện thực như thế 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ý. 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 Layers.

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.

3.    Data Layers

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

Page 6: Kiến trúc 3 layer

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 (DAL) 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 DAL 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 Mapping này trong một bài viết 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 ngoài một cách dễ dàng và đơn giản như truy xuất các dịch vụ nội tại.

Các bạn đã tìm hiểu qua các đặc điểm của từng lớp trong mô hình 3 lớp. Đây là những kiến thức tóm tắt về 3 lớp, bạn nào muốn tìm hiểu kỹ có thể tham khảo các bài viết do chính các chuyên gia của Microsoft viêt lên:

    http://msdn.microsoft.com/en-us/library/ff648105.aspx

Page 7: Kiến trúc 3 layer

    http://msdn.microsoft.com/en-us/library/ee658109.aspx

Hoặc bạn có thể Download cuốn sách “Application Architecture for .NET: Designing Applications and Services” của Microsoft. Đây là cuốn sách rất hữu ích và mô tả rất chi tiết về thiết kế ứng dụng theo mô hình 3 lớp. Tuy nhiên tài liệu này là Tiếng Anh. Hi vọng không quá khó khăn với các bạn đang đam mê Công nghệ.

Tại buổi Seminar gần đây, tôi cũng đã phân tích cho các bạn cách thiết kế một dự án Windows Forms theo mô hình 3 lớp. Ở đó các bạn đã được biết đến có rất nhiều cách đặt tên cho các thành phần của 3 lớp như:

Cách 1: GUI, BUS, DAL

Cách 2: GUI, BLL, DAO, DTO

Cách 3: Presentation, BLL, DAL

…..

Vậy lựa chọn cách nào là đúng!? Đó không hẳn là điều quan trọng mà quan trọng hơn là bạn biết cách viết, viết đúng bản chất của từng lớp. Cách chia dự án trong Ứng dụng demo BookShop của tôi cũng chỉ là 1 trong số rất nhiều cách. Hi vọng đó cũng là một cách để các bạn tham khảo.

Xây dựng Chương trình C# theo mô hình 3 lớp

  Three_tier_Architecture_src.zip (17.5K) 

Lượi tải: 724

I> Những Chỉ Dẫn

Trong mục này chúng ta sẽ thảo luận và xây dựng một chương trình C# thực thi theo mô hình 3 lớp và

một người dùng ảo sử dụng cơ sở dữ liệu MS Access . Trong mục này Tôi đã thử thực thi những thành

phần nhỏ có thể dùng lại (reusable) để bảo vệ người dùng trong việc xây dựng theo 3 lớp . Mục này sẽ

nói cho ta biết làm thế nào để thêm (add) , cập nhập (update), và tìm kiếm chi tiết người dùng .

II> Nền tảng :

Để bắt đầu chúng ta sẽ thảo luận về 1 vấn đề nhỏ sơ bộ về lý thuyết của việc xây dựng mô hình 3 lớp .

Tôi sẽ đi qua một cách vắn tắt để bạn biết cái gì gọi là mô hình 3 lớp và những thuận lợi khi bạn dùng

nó .

Cái gì để xây dựng một mô hình 3 lớp :

Mô hình 3 lớp là kiến trúc kiểu client - server trong đó nó sử dụng giao diện người dùng , quá trình diễn

Page 8: Kiến trúc 3 layer

biến , cất giữ và truy vập dữ liệu để người phát triển bảo vệ những modules (bộ phận tháo rời được) độc

lập hoặc nhiều nền riêng rẽ . Về cơ bản một chương trình có 3 lớp thì từng lớp sẽ làm những nhiệm vụ

sau :

+ Lớp 1 ==> Giới thiệu lớp , lớp GUI

+ Lớp 2 ==> Đối tượng của lớp này là các nhiệm vụ trong chương trình , những lớp nhiệm vụ mang tính

logic .

+ Lớp 3 ==> Lớp truy cập dữ liệu .

Ở đây lớp có thể phát triển và tách riêng ra để kiểm tra .

Cái gì cần để chia lớp ra làm 3 lớp ? Việc chia giao diện người dùng từ nhiệm vụ mang tính logic và truy

cập cơ sở dữ liệu có nhiều thuận lợi . Một vài thuận lợi ta có thê thấy phía dưới .

* Có thể dùng lại các lớp .Cho phép chúng ta có một module để thêm , cập nhập , xoá và tìm kiếm người

dùng trong hệ thống . Nếu như những thành phần này đã được kiểm tra và phát triển thì chúng ta có thể

dùng lại nó trong bất cứ project nào tương tự .

* Ta có thể thay đổi hệ thống một cách dễ dàng . Nếu ở đây các lớp của chúng ta có những thay đổi nhỏ

thì chúng ta cũng không cần phải cài đặt lại chương trình của chúng ta trên máy của người dùng (Dạng

như cập nhập phiên bản mới) . Nếu sự thay đổi đó trong khoảng từ 10 % đến 15% thì bạn chỉ cần cập

nhập lại các lớp này .

* Có những hàm riêng rẻ trong server cho phép phát triển song song những lớp riêng rẻ bởi chuyên gia

phần mềm .

* Cung cấp nhiều tài nguyên linh hoạt .

III> Sử dụng Code

Chương trình mà bạn tải ở trên có 3 lớp . Lớp thứ nhất hay còn gọi là FrmGUI , lớp thứ hai hoặc những

nhiệm vụ logic sẽ được gọi tắt BOCustomer cho đối tượng Customer và cuối cùng lớp thứ ba hay còn gọi

là lớp dữ liệu sẽ gọi tắt để truy cập dữ liệu của người dùng . Tôi có biên soạn tất cả lớp trong những

project giống nhau để làm việc nhẹ nhàng hơn . Tôi bao gồm lại những mã nguồn dọc theo cơ sở dữ liệu

Access , cái mà được sử dụng để kiểm tra trong project này bao gồm trong file zip .

Lớp Thứ Nhất (User Interface Tier)

Đây là một đoạn của code từ giao diện của người dùng . Tôi chỉ bao gồm những hàm được sử dụng để

gọi lớp giữa (lớp thứ hai) .

Tôi sẽ giữ tham chiếu đến lớp thứ hai như BOCustomer.

//This function get the details from the user via GUI                 //tier and calls the Add method of business logic layer.                private void cmdAdd_Click(object sender, System.EventArgs e)        {                  try                  {

Page 9: Kiến trúc 3 layer

                                cus = new BOCustomer();                                cus.cusID=txtID.Text.ToString();                                cus.LName = txtLName.Text.ToString();                                cus.FName = txtFName.Text.ToString();                                cus.Tel= txtTel.Text.ToString();                                cus.Address = txtAddress.Text.ToString();                                cus.Add();                  }                  catch(Exception err)                  {                                MessageBox.Show(err.Message.ToString());                  }        }                //This function gets the ID from the user and finds the                 //customer details and return the details in the form of                //a dataset via busniss object layer. Then it loops through                 //the content of the dataset and fills the controls.                         private void cmdFind_Click(object sender, System.EventArgs e)        {                  try                  {                                String cusID = txtID.Text.ToString();                                                                          BOCustomer thisCus = new BOCustomer();                                                                          DataSet ds = thisCus.Find(cusID);                                         DataRow row;                                row = ds.Tables[0].Rows[0];                                         //via looping                                        foreach(DataRow rows in ds.Tables[0].Rows )                                {                                   txtFName.Text = rows["CUS_F_NAME"].ToString();                                   txtLName.Text = rows["CUS_L_NAME"].ToString();                                   txtAddress.Text = rows["CUS_ADDRESS"].ToString();                                   txtTel.Text = rows["CUS_TEL"].ToString();                                }                  }                  catch (Exception err)                  {                                MessageBox.Show(err.Message.ToString());                  }                 }                //this function used to update the customer details.                 private void cmdUpdate_Click(object sender,

Page 10: Kiến trúc 3 layer

                                                                         System.EventArgs e)        {                  try                  {                                cus = new BOCustomer();                                cus.cusID=txtID.Text.ToString();                                cus.LName = txtLName.Text.ToString();                                cus.FName = txtFName.Text.ToString();                                cus.Tel= txtTel.Text.ToString();                                cus.Address = txtAddress.Text.ToString();                                         cus.Update();                  }                  catch(Exception err)                  {                                MessageBox.Show(err.Message.ToString());                  }        }

Lớp Thứ Hai (Business Logic Layer)

Ở đây tôi sẽ bao gồm tất cả những đoạn code trong lớp này . Những thuộc tính cơ bản của nó là để định

nghĩa cho đối tượng người dùng . Nhưng như tôi đã đề cập thì đây là những người dùng ảo và có khi

phải cập nhập thêm vào khi sử dụng . Nó cũng có tất cả các phương thức bao gồm những việc như thêm

, tìm kiếm , sửa chữa được sử dụng để bảo quản chi tiết người dùng .

Đây là lớp thứ hai (lớp giữa) sẽ thực thi những hành động giữa lớp thứ nhất và thứ ba . Nó giữ một tham

chiếu đến lớp truy cập dữ liệu (lớp thứ ba ) chẳng hạn như cusData = new DACustomer() . Nó cũng tham

chiếu đến namespace System.Data và đôi khi nó chả về chi tiết trong Form của Dataset đến lớp thứ

nhất .

using System;  using System.Data;    namespace _3tierarchitecture  {                /// <SUMMARY>                  /// Summary description for BOCustomer.                  /// </SUMMARY>                                  public class BOCustomer                {                          //Customer properties                            private String fName;                          private String lName;                          private String cusId;                          private String address;

Page 11: Kiến trúc 3 layer

                          private String tel;                             private DACustomer cusData;                    public BOCustomer()                 {                          //An instance of the Data access layer!                             cusData = new DACustomer();                   }                                      /// <SUMMARY>                            /// Property FirstName (String)                            /// </SUMMARY>                            public String FName                           {                                                        get                                        {                                                  return this.fName;                                        }                                        set                                        {                                                  try                                                  {                                                                this.fName = value;                                                                   if (this.fName == "")                                                                {                                                                          throw new Exception(                                                                                "Please provide first name ...");                                                                }                                                  }                                                  catch(Exception e)                                                  {                                                                throw new Exception(e.Message.ToString());                                                  }                                        }                          }                             /// <SUMMARY>                            /// Property LastName (String)                            /// </SUMMARY>                            public String LName                          {

Page 12: Kiến trúc 3 layer

                                        get                                        {                                                  return this.lName;                                        }                                        set                                        {                                                  //could be more checkings here eg revmove ' chars                                                    //change to proper case                                                    //blah blah                                                    this.lName = value;                                                  if (this.LName == "")                                                  {                                                                throw new Exception("Please provide name ...");                                                  }                                           }                          }                                                     /// <SUMMARY>                            /// Property Customer ID (String)                            /// </SUMMARY>                            public String cusID                          {                                        get                                        {                                                  return this.cusId;                                        }                                        set                                        {                                                  this.cusId = value;                                                  if (this.cusID == "")                                                  {                                                                throw new Exception("Please provide ID ...");                                                  }                                           }                          }                             /// <SUMMARY>                            /// Property Address (String)                            /// </SUMMARY>                            public String Address                          {                                        get

Page 13: Kiến trúc 3 layer

                                        {                                                  return this.address;                                        }                                        set                                        {                                                  this.address = value;                                                     if (this.Address == "")                                                  {                                                                throw new Exception("Please provide address ...");                                                  }                                        }                          }                             /// <SUMMARY>                            /// Property Telephone (String)                            /// </SUMMARY>                            public String Tel                          {                                        get                                        {                                                  return this.tel;                                        }                                        set                                        {                                                  this.tel = value;                                                  if (this.Tel == "")                                                  {                                                                throw new Exception("Please provide Tel ...");                                                  }                                           }                          }                             /// <SUMMARY>                            /// Function Add new customer. Calls                             /// the function in Data layer.                            /// </SUMMARY>                            public void Add()                          {                                        cusData.Add(this);                          }                                /// <SUMMARY>                            /// Function Update customer details.

Page 14: Kiến trúc 3 layer

                            /// Calls the function in Data layer.                            /// </SUMMARY>                            public void Update()                           {                                        cusData.Update(this);                          }                             /// <SUMMARY>                            /// Function Find customer. Calls the                             /// function in Data layer.                            /// It returns the details of the customer using                             /// customer ID via a Dataset to GUI tier.                            /// </SUMMARY>                            public DataSet Find(String str)                           {                                        if (str == "")                                                throw new Exception("Please provide ID to search");                                                                                        DataSet data = null;                                           data = cusData.Find(str);                                           return data;                          }                }  }

Lớp Thứ Ba (Data Access Layer)

Đây là lớp dữ liệu có chi tiết về cơ sở dữ liệu MS Access . Tuy nhiên tất cả những chi tiết thì cũng rõ ràng

và không ảnh hưởng đến lớp thứ hai . Module này sẽ tham chiếu đến lớp thứ hai như BOCustomer cus .

Để có thể dễ dàng sử dụng bởi bất kì một cơ sở dữ liệu khác tôi đã tạo một vài hằng số bao gồm có tên

cơ sở dữ liệu và tên vùng cần thay đổi như bảng chi tiết về người dùng . Đây là một module có thể dùng

cho bất kì một cơ sở dữ liệu nào sau khi đã thay đổi .

using System;using System.Data.OleDb;using System.Data;

namespace _3tierarchitecture

{

Page 15: Kiến trúc 3 layer

        /// <SUMMARY>

        /// Summary description for DACustomer.

        /// </SUMMARY>

        public class DACustomer        {                private OleDbConnection cnn;                //change connection string as per the

                //folder you unzip the files

                private const string CnnStr =                   "Provider=Microsoft.Jet.OLEDB.4.0;Data " +                  "Source= D:\\Rahman_Backup\\Programming\\" +                          "Csharp\\3tierarchitecture\\customer.mdb;";

                //local variables                private String strTable="";                private String strFields="";                private String strValues="";                private String insertStr="";                                //this needs to be changed based on customer                 //table fields' Name of the database!                private const String thisTable = "tblCustomer";                private const String cus_ID = "CUS_ID";                private const String cus_LName = "CUS_L_NAME";                private const String cus_FName = "CUS_F_NAME";                private const String cus_Tel = "CUS_TEL";                private const String cus_Address = "CUS_ADDRESS"; 

                public DACustomer()                {                }                                public DACustomer(BOCustomer cus)                {                        // A reference of the business object class                }                                //standard dataset function that adds a new customer

                public void Add(BOCustomer cus)                {

                        String str = BuildAddString(cus);                                                OpenCnn();

                        //Open command option - cnn parameter is imporant                        OleDbCommand cmd = new OleDbCommand(str,cnn);

Page 16: Kiến trúc 3 layer

                        //execute connection                        cmd.ExecuteNonQuery();                                                // close connection                        CloseCnn();                                        }                                //standard dataset function that updates                 //details of a customer based on ID                public void Update(BOCustomer cus)                {                        OpenCnn();                                                String selectStr = "UPDATE " + thisTable +                                 " set " + cus_LName + " = '" + cus.LName + "'" +                                ", " + cus_FName + " = '" + cus.FName + "'" +                                ", " + cus_Address + " = '" + cus.Address + "'" +                                ", " + cus_Tel + " = '" + cus.Tel + "'" +                                " where cus_ID = '" + cus.cusID + "'";

                        OleDbCommand cmd = new OleDbCommand(selectStr,cnn);

                        cmd.ExecuteNonQuery();                                                CloseCnn();                }                                //standard dataset function that finds and                 //return the detail of a customer in a dataset                public DataSet Find(String argStr)                {                        DataSet ds=null;

                        try                        {                                OpenCnn();                                                        String selectStr = "select * from " + thisTable +                                                           " where cus_ID = '" + argStr + "'";                                OleDbDataAdapter da =                                            new OleDbDataAdapter(selectStr,cnn);                                ds = new DataSet();                                da.Fill(ds,thisTable);                                                        CloseCnn();

                                                        }                        catch(Exception e)                        {                                String Str = e.Message;                        }

Page 17: Kiến trúc 3 layer

                        return ds;                }

                private void OpenCnn()                {                        // initialise connection                        String cnnStr = CnnStr;                        cnn = new OleDbConnection(cnnStr);                        // open connection                        cnn.Open();                }

                private void CloseCnn()                {                        // 5- step five                        cnn.Close();                }                                // just a supporting function that builds                 // and return the insert string for dataset.                private String BuildAddString(BOCustomer cus)                {                        // these are the constants as                         // set in the top of this module.                        strTable="Insert into " + thisTable;                        strFields=" (" + cus_ID +                         "," + cus_LName +                         "," + cus_FName +                         "," + cus_Address +                         "," + cus_Tel + ")";                                                //these are the attributes of the                         //customer business object.                        strValues= " Values ( '" + cus.cusID +                         "' , '" + cus.LName +                         "' , '" + cus.FName +                         "' , '" + cus.Address +                         "' , '" + cus.Tel + "' )";

                        insertStr = strTable + strFields + strValues;                                                return insertStr;                                        }        }}

Page 18: Kiến trúc 3 layer

L ậ p trình h ướ ng đ ố i t ượ ng v ớ i mô hình 3 l ớ p (3 layers)

10JUN

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.

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.

1. Giới thiệu các thành phần của mô hình 3layer

Mô hình layer gồm có 3 layer:

o Layer GUI (Graphics User Interface)

o Layer Business Logic (Đây là layer để xử lý các dữ liệu, thông tin trước khi đưa lên giao

diện hoặc đưa xuống dữ liệu.)o Layer Data Access – Layer này sẽ nói chuyện Data.

Page 19: Kiến trúc 3 layer

1.1. GUI Layer.o Đây là layer tạo lên giao diện cho người dùng, nó sẽ là nơi tiếp nhận và kết xuất ra kết quả

của chương trình cho bạn.o Nó có nhiệm vụ xử lý, kiểm tra các dữ liệu nhập vào ( ví như ở TextBox này nó phải là số,

số phải từ 1-9….).o Nó tiếp nhận các Event của người dùng, kiểm tra dữ liệu được nhập vào, gửi yêu cầu xử lý

xuống tầng kế tiếp.

1.2. Business Logic Layero Đây là layer xử lý chính các dữ liệu trước khi được đưa lên hiển thị trên màn hình hoặc xử

lý các dữ liệu trước khi lưu dữ liệu xuống cơ sở dữ liệu.o Đây là nơi đê kiểm tra các yêu cầu nghiệp vụ, tính toán các yêu cầu nghiệp vụ.

o Tại đây các tính năng tính toán trong chương trình sẽ được thực thi. (Như tính lương theo

một công thức.)

1.3. Data Access Layero Layer này sẽ lo nhiệm vụ là đọc cơ sở dữ liệu lên, cập nhật cơ sở dữ liệu, update cơ sở dữ

liệu.o Nói chung là nó làm nhiệm vụ là nói chuyện phải trái với database.

1.4. Cách các layer “nói chuyện” với nhau.

Vấn đề đặt ra ở đây là 3 layer này ‘Nói chuyện’ với nhau như thế nào

Nhìn vào sơ đồ ta cũng sẽ nhận được câu trả lời:

Quá trình hiển thị dữ liệu:

Data Access layer nói chuyện với Database và lấy dữ liệu lên theo một cách nào đó (có

thể là bằng câu lệnh select hay thông qua proceduce) lúc này sau khi lấy được dữ liệu lên

thì nó sẽ đẩy lên Business layer tại đây Business cần nhào bột, thêm mắm muối rồi đẩy nó

lên trên GUI và tại GUI nó sẽ hiển thị lên cho người dùng

Quá trình đưa dữ liệu xuống.

Page 20: Kiến trúc 3 layer

Người dùng thao tác với GUI layer sau đó ra lệnh thực hiện (ví như Insert) sau đó hệ

thống sẽ kiểm tra các thông tin người dùng nhập vào nếu thỏa đi xuống tiếp layer

Business để tiếp tục được nhào nặn, tính toán và kiểm tra sau khi xong thì dữ liệu được

đẩy xuống thông tin phía dưới Data Access Layer sau đó tại DataAccess Layer sẽ thực thi

nó xuống database.

1.5. Cách xử lý “lỗi” trong mô hình 3 layer.

Một khi gặp lỗi (các trường hợp không đúng dữ liệu) thì đang ở layer nào thì quăng lên

trên layer cao hơn nó 1 bậc cho tới GUI thì sẽ quăng ra cho người dùng biết.

1.6. Demo mô hình 3 layer trong chương trình quản lý

Page 21: Kiến trúc 3 layer