Ứng dụng mẫu thiết kế trong thiết kế khung cho tầng truy cập dữ liệu

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Phát triển mẫu thiết kế phần mềm và ứng dụng (Trang 108 - 113)

CHƯƠNG 4. PHÁT TRIỂN MẪU THIẾT KẾ VÀ ỨNG DỤNG

4.3. Ứng dụng mẫu thiết kế trong thiết kế khung cho tầng truy cập dữ liệu

Khi xây dựng phần mềm, lập trình viên thường quan tâm đến hệ cơ sở dữ liệu mà ứng dụng sẽ tương tác. Điều này có một trở ngại là khi người dùng thay đổi hệ dữ liệu thì chương trình không thực hiện được, hoặc phải cài đặt lại.

Một trường hợp khác là một số phần mềm tương tác với nhiều hệ cơ sở dữ liệu khác nhau, nhƣ: DB2, MySQL, SQLServer, Oracle, …. Lúc này buộc phải cài đặt các điều khiển truy cập dữ liệu theo yêu cầu. Điều này phát sinh một số vấn đề: tài nguyên cơ sở dữ liệu đƣợc khởi tạo chậm, mã cài đặt truy cập dữ liệu phức tạp, cồng kềnh dẫn đến khó phát triển và bảo trì.

Dựa trên lý thuyết thiết kế chương trình theo mô hình ba tầng (3-Layer), luận văn áp dụng các mẫu thiết kế (Factory Method, Singleton và Null Object) để thiết kế và cài đặt Framework cho tầng truy cập dữ liệu một cách tổng quát, sử dụng đối tƣợng ADO.Net nhằm khắc phục những nhƣợc điểm nêu trên.

4.3.2. Mô hình 3 tầng

Ngày nay, đa phần các ứng dụng dựa trên mô hình 2-tầng Client/Server, trong đó tất cả mã lệnh về giao diện người dùng (UI), logic nghiệp vụ (Business logic) và truy cập dữ liệu (Data access) được viết “bên dưới” tầng giao diện. Việc ứng dụng mô hình 2-tầng làm cho người phát triển ban đầu dễ triển khai và thời gian ngắn. Tuy nhiên có nhƣợc điểm là: khó thay đổi theo các nghiệp vụ khi chúng bị thay đổi do yêu cầu thực tế, khó bảo trì, tích hợp và không có khả năng kế thừa.

Để quản lý các thành phần hệ thống một cách độc lập, không ảnh hưởng bởi các thay đổi, người ta nhóm những thành phần có cùng chức năng với nhau, phân chia nhiệm vụ cho từng nhóm để công việc không bị chồng chéo và ảnh hưởng lẫn nhau.

Khi đó, người ta dùng kiến trúc đa tầng (hay nhiều tầng), mỗi tầng thực hiện một chức năng nào đó, trong đó mô hình 3-tầng do MicroSoft đề xuất là phổ biến nhất, gồm:

tầng trình diễn PL (Presentation Layer), tầng nghiệp vụ BL (Business Layer) và tầng dữ liệu DL (Data Layer).

Các tầng này giao tiếp với nhau thông qua các dịch vụ mà mỗi tầng cung cấp để tạo nên ứng dụng. Tầng này không cần biết bên trong tầng kia làm gì mà chỉ quan tâm tầng kia cung cấp dịch vụ gì cho mình và sử dụng nó. Giao diện người dùng không gọi trực tiếp tầng DL và ngược lại, vì lý do an toàn và các giao tác thường được quản lý trong tầng BL. Tất cả các trao đổi với cơ sở dữ liệu phải thông qua giao diện dịch vụ trong tầng BL.

4.3.3. Cài đặt mô hình khung cho tầng truy cập dữ liệu

Để dễ hình dung ta có thể xét một mô hình ứng dụng đƣợc thiết kế theo mô hình 3-tầng như hình dưới. Tầng DL lưu trữ và truy xuất dữ liệu, được chia thành hai phần:

DataAccess và DataStorage:

 DataStorage: lưu trữ dữ liệu và thực hiện các dịch vụ của hệ quản trị cơ sở dữ liệu nhƣ SQL Server, Oracle, DB2, MySQL, …

 DataAccess: gồm các đối tƣợng tác nghiệp (Business Object) và đối tƣợng kết nối, truy cập dữ liệu. Business Object cung cấp dịch vụ từ tầng DL cho tầng trên, nhƣ các dịch vụ: chèn, cập nhật, xóa dữ liệu.

Tầng PL và DL độc lập nhau, trao đổi với nhau qua tầng BL. Do đó, việc thay đổi hệ quản trị cơ sở dữ liệu SQL Server thành Oracle, Oracle thành DB2,… hay ngược lại thì giao diện chương trình vẫn không thay đổi.

Trong cài đặt khung cho tầng truy cập dữ liệu tổng quát, ta xây dựng các Business Object dựa trên đối tƣợng ADO.Net để cung cấp dịch vụ cho tầng BL và bảo đảm sự độc lập giữa hai tầng PL và DL.

Có một cách là xây dựng một lớp dịch vụ có phương thức chứa điều khiển switch để biết đƣợc kiểu của điều khiển truy cập cơ sở dữ liệu nào đƣợc thực hiện, rồi cài đặt mã tương tác tương ứng. Giả sử phương thức này được cài đặt như sau :

public override void MyProcedure(proType ProviderType){

switch(proType){

case ProviderType.SqlClient:

objSqlCommand.SqlProcedure () break;

case ProviderType.OleDb:

objOleDbCommand.QleDbProcedure()

break;

default:

break;

} }

Cách thiết kế và cài đặt nhƣ trên có một số nhƣợc điểm: mã lệnh cài đặt nhiều do phải viết lại những đoạn mã tương tự nhau, phức tạp và đôi khi là không cần thiết.

Mặt khác khi muốn truy cập cơ sở dữ liệu mới thì phải cài đặt và biên dịch lại lớp này.

Giải quyết vấn đề này bằng cách sử dụng các mẫu Factory Method, Singleton và Null Object để cài đặt một Framework cho tầng truy cập dữ liệu tổng quát. Biểu đồ lớp cho bài toán được trình bày trong hình dưới, trong đó, lớp DataAccessBaseClass và các lớp kế thừa nó là các Business Object chứa các dịch vụ cung cấp cho tầng BL tương tác với cơ sở dữ liệu.

Hình 4.18. Biểu đồ lớp của tầng truy cập dữ liệu

Lớp DataAccessBaseClass là lớp Product gồm các thuộc tính và phương thức tổng quát để tương tác với các hệ cơ sở dữ liệu, các phương thức này là các phương thức đƣợc nạp chồng.

Các lớp OdbcDataAccess, OleDbDataAccess, OracleDataAccess, SqlDataAccess, NullObject (là các lớp ConcreteProduct) đƣợc kế thừa từ lớp DataAccessBaseClass và cài đặt chi tiết phương thức GetDataProviderConnection() (trả về đối tượng chuỗi kết nối đến hệ cơ sở dữ liệu tương ứng) và

private ConcreteCreator() {}

//Lấy giá trị được thiết lập trong tệp tin cấu hình private static string GetAppSetting(string setting){

string val;

try {

val = System.Configuration.ConfigurationSettings.

AppSettings[setting].ToString();

}

catch (NullReferenceException e){

val = "";

}

if (val == null) val = "";

return val;

}

/*Lấy chuỗi kết nối database bằng cách đọc trong tệp tin cấu hình (app.config)*/

private static string GetConnectionString(){

string val;

val = "server=" + GetAppSetting("Datasource") +

";database=" + GetAppSetting("Database") +

";uid=" + GetAppSetting("Userid") +

";pwd=" + GetAppSetting("Password") + ((GetAppSetting("Timeout").Length > 0) ?

";Connection Timeout=" + GetAppSetting("Timeout"): "");

return val;

}

/*Xây dựng một data provider của tầng truy cập dữ liệu dựa trên các thiết lập cấu hình ứng dụng. Tập tin cấu hình ứng dụng phải chứa 2 key:

1. "DataProviderType" key : giá trị của nó là một trong các giá trị được định nghĩa (sql,oracle,access,odbc,oledb)

2. "ConnectionString" key : chuỗi kết nối database*/

public static DataAccessBaseClass GetDataAccessLayer(){

if (GetAppSetting("DataProviderType") == null

||GetAppSetting("Datasource") == null

|| GetAppSetting("Database") == null)

throw new ArgumentNullException("Chưa chỉ định 'DataProviderType' hoặc chưa chỉ định 'Server' hoặc chưa chỉ định 'Database' trong tệp tin cấu hình");

DataProviderType dataProvider;

try{

dataProvider=

(DataProviderType)System.Enum.Parse(typeof(DataProviderTy pe),GetAppSetting("DataProviderType"));

}

catch(Exception e){

throw new ArgumentException("Kiểu provider cho tầng truy cập dữ liệu không hợp lệ.");

}

return getDataAccessLayer(dataProvider,GetConnectionString());

}

/*Xây dựng một data provider của tầng truy cập dữ liệu dựa Provider được cung cấp. Chuỗi connection được lấy từ thuộc tính ConnectionString của lớp DataAccessBaseClass*/

public static DataAccessBaseClass

GetDataAccessLayer(DataProviderType dataProviderType){

return GetDataAccessLayer(dataProviderType, null);

}

/*Xây dựng một data provider của tầng truy cập dữ liệu dựa Provider và chuỗi connection được cung cấp*/

public static DataAccessBaseClass

GetDataAccessLayer(DataProviderType dataProviderType, string connectionString) {

switch (dataProviderType){

case DataProviderType.OleDb:

return new OleDbDataAccess(connectionString);

case DataProviderType.Odbc:

return new OdbcDataAccess(connectionString);

case DataProviderType.Oracle:

return new OracleDataAccess(connectionString);

case DataProviderType.Sql:

return new SqlDataAccess(connectionString);

default:

return new NullObject (connectionString);

} }

Để sử dụng Framework này ta chỉ cần gọi phương thức GetDataAccessLayer sử dụng hai tham số DataProviderType và ConnectionString để lấy về đối tƣợng điều khiển thao tác với hệ cơ sở dữ liệu tương ứng. Các tham số được người dùng cung cấp

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Phát triển mẫu thiết kế phần mềm và ứng dụng (Trang 108 - 113)

Tải bản đầy đủ (PDF)

(113 trang)