Cấp bậc tác giả:

TRAINING

[TUT .netTiers]Giới thiệu Lớp Data

Được viết bởi webmaster ngày 05/06/2013 lúc 11:22 AM
Bài trước Tôi đã giới thiệu về Lớp Entity, một trong những kiểu quan trọng cần thiết trong ứng dụng. Khái niệm Entity nằm trong ứng dụng bussiness. Các kiểu của chúng bảo đảm tính toàn vẹn của thực thể. Bài này Tôi sẽ giới thiệu về Lớp Data
  • 0
  • 1698

[TUT .netTiers]Giới thiệu Lớp Data


Bài trước Tôi đã giới thiệu về Lớp Entity, một trong những kiểu quan trọng cần thiết trong ứng dụng. Khái niệm Entity nằm trong ứng dụng bussiness. Các kiểu của chúng bảo đảm tính toàn vẹn của thực thể. Bài này Tôi sẽ giới thiệu về Lớp Data

Data Layer:
Sử dụng cách tiếp cận lớp khi xây dựng framework mang lại cho bạn rất nhiều tính linh hoạt đặc biệt là khi nói đến lớp dữ liệu.

Tại sao cần lớp riêng biệt cho việc truy cập dữ liệu?

Có rất nhiều lý do chính đáng tại sao bạn muốn tách lớp data access từ các lớp khác. Giữ lớp data access riêng biệt cung cấp cho bạn khả năng để tạo ra khái niệm trừu tượng dữ liệu API. Nghĩa là bạn tạo ra API cho dữ liệu của bạn, mà thực sự không biết gì về cách lấy dữ liệu từ cơ sở dữ liệu, dịch vụ web, lưu trữ xml, v...v. Microsoft đã thực sự thúc đẩy mô hình nhà cung cấp, dẫn đến sự linh hoạt tuyệt vời trong các ứng dụng. Hãy suy nghĩ về mô hình nhà cung cấp như mẫu plug-in đảo ngược. Một plug-in chỉ tồn tại trong thư mục nào đó và phát hiện được thực thi bởi client và thường được nạp trong khi khởi động ứng dụng. Trong khi đó, provider được nhập thông qua cấu hình và nạp trong khi chạy. Lợi ích là bạn có thể viết một số provider tùy thuộc vào nhu cầu của bạn. Sử dụng provider cho phép bạn chuyển đổi ra toàn bộ thực hiện của bạn chỉ bằng cách thay đổi tên provider mặc định trong thực hiện cấu hình. Các lớp, các lớp dữ liệu trừu tượng và các lớp thực thi provider cụ thể, tham khảo các dự án Entities như sự phụ thuộc. Khi làm việc với dữ liệu lấy từ cơ sở dữ liệu, các thực thể và các bộ sưu tập được tạo ra từ các lớp và trả lại các phương thức.

Ví dụ Kiến trúc:

Lấy ví dụ, bạn đang muốn tạo ra một dự án mới mang tính cách mạng trên thị trường ứng dụng CRM. Bạn có ý tưởng xây dựng ứng dụng này như là một client thông minh, và ứng dụng máy chủ. Vì vậy, yêu cầu là tạo ra một ứng dụng máy chủ client tuyệt vời. Bạn có thể tạo ra cơ sở mã duy nhất, và có thể truy cập API dữ liệu của bạn ra khỏi hộp qua các dịch vụ web cho ứng dụng client. Trên phía client sẽ sử dụng WsClientProvider, trong khi các ứng dụng máy chủ lưu trữ các thiết bị đầu cuối WebService sẽ sử dụng SqlClientProvider.

Cơ sở dữ liệu được hỗ trợ:

Hiện .netTiers hỗ trợ SQL Server 2000, SQL Server 2005, SQL Server 2008 và SQL Server Express. Một số nhà cung cấp cơ sở dữ liệu khác như SqlLite, Mozilla Firebird, và Oracle có hỗ trợ giới hạn với Generic Client có sẵn.

DataRepository là gì?

DataRepository là điểm vào dữ liệu API truy cập bằng cách sử dụng cung cấp dữ liệu cấu hình mặc định. Nó là cơ chế trung tâm cho instantiating và tải các provider trong runtime, và quan trọng hơn, lấy và lưu dữ liệu cho dữ liệu API. DataRepository tự bản chất là đối tượng singleton facade vào trong API bằng cách sử dụng các mẫu Decorator của các provider thực thể TableModule riêng biệt. Lớp này trực tiếp trong các dữ liệu trừu tượng Access Layer như đã đề cập trước đó để nó không tham chiếu bất kỳ thực thi cung cấp dịch vụ cụ thể, mà chỉ biết về tất cả các thực thể của bạn, phương thức tiếp cận của chúng. Một vài kiểu phương thức gọi như sau: 

Ví dụ:

DataRepository.OrdersProvider.GetAll();
DataRepository.OrdersProvider.GetByOrderDate(DateTime.Today);
DataRepository.OrdersProvider.Insert(transactionManager, order);

Làm thế nào để DataRepository biết provider để sử dụng?

Khi DataRepository lần đầu tiên được gọi, nó sẽ kiểm tra cấu hình hiện tại trong app/web.config của bạn trong configSection netTiersService để xác định các nhà cung cấp mặc định hiện tại và có thể cấu hình bất kỳ nhà cung cấp khác đã được cấu hình. . Trong tiến trình này, các kho lưu trữ dữ liệu sẽ được tải NetTiersProvider mặc định, theo mặc định của nhà cung cấp netTiers. Sẽ là SqlNetTiersProvider. Lớp này trực tiếp trong các lớp DataAccessLayer.SqlClient của tiến trình tạo mặc định.

Phương thức truy cập?

Phương thức truy cập là phương thức bao gồm các dữ liệu API. Tùy thuộc vào cách .netTiers được cấu hình nó sẽ xác định và tạo ra tập logic phương thức truy cập dữ liệu sử dụng các mối quan hệ mô hình dữ liệu và làm thế nào để behavior của chúng ảnh hưởng đến mối quan hệ bình thường. Trong tiến trình gene .netTiers, Mẫu .netTiers sẽ xác định và tạo ra phương thức API ban đầu của bạn dựa trên các index, key, stored procedure, và một vài cơ chế khác.

Các Phương thức đọc:
  • Get All
  • Get By Primary Key Id
  • Get By composite foreign key columns
  • Get By Composite index column
  • Get By Dynamic WhereClause (Paged Result)
  • Get By Custom Stored Procedure
Các Phương thức ghi:
  • Insert
  • Update
  • Delete
  • Save
  • Custom - using Custom Stored Procedure
Tùy chỉnh Thư viện Enterprise Data Access:

Đối với trường hợp mở rộng mà bạn muốn truy cập dữ liệu của riêng bạn gọi bên trong các API, bạn chỉ có thể sử dụng phương thức tương tự .netTiers tự động tạo ra cho bạn, hoặc thậm chí bạn có thể gõ tất cả các phương thức DataAccess rằng Thư viện Enterprise Data Application khóa provider. Nó sẽ tự động nhận thông tin kết nối hiện tại và bạn có thể vượt qua nó giao dịch mở hiện có bằng cách sử dụng TransactionManager truy cập dữ liệu chung:
  • ExecuteReader
  • ExecuteScalar
  • ExecuteDataSet
  • ExecuteNonQuery
Ví dụ:

string sqlCommand = "GetEmployeeName";
// Retrieve EmployeeName ExecuteScalar returns an object, so 
 // we cast to the correct type (string). 
string employeeName = (string)DataRepository.Provider.ExecuteScalar(CommandType.StoredProcedure, sqlCommand);

Có một số lớp hỗ trợ trong việc xây dựng các điều kiện tìm kiếm động nhưng an toàn. 
  • SqlExpressionParser - phân tích cú pháp thuật ngữ tìm kiếm
  • SqlStringBuilder -xây dựng biểu thức lọc (sử dụng SqlExpressionParser nội bộ)
  • SqlFilterBuilder - bộ lọc xây dựng biểu thức chung (sử dụng cột liệt kê tổ chức)
  • EntityFilterBuilder - bộ lọc xây dựng biểu thức lọc mạnh mẽ
  • ParameterizedSqlExpressionParser - phân tích từ tìm kiếm vào biểu tham số
  • ParameterizedSqlFilterBuilder -  xây dựng biểu hiện tham số chung chung (sử dụng cột liệt kê tổ chức)
  • EntityParameterBuilder - xây dựng biểu hiện tham số lọc mạnh mẽ
  • SqlFilterParameter - đại diện cho thông tin cần thiết cho tham số lệnh cơ sở dữ liệu
  • SqlFilterParameterCollection - chuỗi truy vấn tham số và bộ sưu tập của các đối tượng SqlFilterParameter
  • SqlParameter - lớp con của System.Web.UI.WebControls.Parameter cho phép nhà phát triển ASP.NET sử dụng ParameterizedSqlFilterBuilder (mặc định) hoặc SqlFilterBuilder cùng với bất kỳ kiểm soát nguồn dữ liệu.
  • EntityFilter - sử dụng cùng với SqlParameter để ràng buộc điều khiển bộ lọc đầu vào để kiểm soát nguồn dữ liệu.
Ví dụ:

CustomersParameterBuilder query1 = new CustomersParameterBuilder();
query1.Append(CustomersColumn.CustomerID, "A%");
query1.Append(CustomersColumn.City, "London, Berlin");
 
TList<Customers> list1 = DataRepository.CustomersProvider.Find(query1.GetParameters());
Console.WriteLine("Query1 = {0}", query1);
Console.WriteLine("Count1 = {0}", list1.Count);

Kết quả:

(CustomerID LIKE @Param0) AND (City = @Param1 OR City = @Param2)
-- Count1 = 2

Giả sử bạn có yêu cầu cao hơn. Ví dụ, giả sử bạn muốn tìm tất cả các khách hàng với ID khách hàng bắt đầu với "A" và sống ở London hoặc ID khách hàng bắt đầu với "B" và sống tại Berlin. Trong trường hợp này bạn sẽ cần phải áp dụng nâng cao hơn nữa.

Ví dụ:

CustomersParameterBuilder query1 = new CustomersParameterBuilder();
query1.Clear();
query1.Junction = string.Empty; // This prevents the ParameterBuilder from throwing an "AND" before next line's output
query1.BeginGroup();
query1.Append(string.Empty, CustomersColumn.CustomerID, "A%", true);
query1.Append("AND", CustomersColumn.City, "London", true);
query1.EndGroup();
query1.BeginGroup("OR");
query1.Append(string.Empty, CustomersColumn.CustomerID, "B%", true);
query1.Append("AND", CustomersColumn.City, "Berlin", true);
query1.EndGroup();

TList<Customers> list1 = DataRepository.CustomersProvider.Find(query1.GetParameters());
Console.WriteLine("Query1 = {0}", query1);

Kết quả:

(CustomerID LIKE @Param0 AND City = @Param1) OR (CustomerID LIKE @Param2 AND City = @Param3)

Cùng với các biểu thức lọc, query1 cũng có bộ sưu tập của các đối tượng SqlFilterParameter giữ tên, kiểu, giá trị của mỗi tham số được đặt tên. Bộ sưu tập này, được trả về bởi query1.GetParameters(), được thông qua vào phương thức Find nạp chồng mới tự động tạo ra câu lệnh SQL paramaterized, áp dụng các thông số lệnh cần thiết, sau đó thực hiện truy vấn. 
Lớp SqlStringBuilder, cùng với tất cả sub-classes, có chứa một số biến thể của phương thức Append để cho phép bạn xác định truy vấn đơn giản hay phức tạp. Ngoài ra, nhận thấy rằng phương thức Append sử dụng trong ví dụ này chấp nhận việc sử dụng các ký tự thẻ tự nhiên. 
Tạo truy vấn không tham số cho nhiều lần khi một là không cần thiết. 

Ví dụ:

CustomersFilterBuilder query2 = new CustomersFilterBuilder();
query2.Append(CustomersColumn.CustomerID, "A*");
query2.Append(CustomersColumn.City, "London, Berlin");
int count = 0;
TList<Customers> list2 = DataRepository.CustomersProvider.GetPaged(
query2.ToString(), null, 0, 100, out count);
 
Console.WriteLine("Query2 = {0}", query2);
Console.WriteLine("Count2 = {0}", list2.Count);  

Kết quả:

Query2 = (CustomerID LIKE 'A%') AND (City = 'London' OR City = 'Berlin')
--Count2 = 2

Custom Stored Procedures

Bởi netTiers mặc định pre-populates thuộc tính CustomProcedureStartsWith với chuỗi formattable "_{0}_", trong đó {0} hiện tại Bảng Tên, có nghĩa là nó sẽ xem xét thông qua tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu, và nếu thủ tục của bạn bắt đầu với chuỗi nó sẽ đủ điều kiện để đưa vào như là một tùy chỉnh stored procedure.

Người dùng quy ước đặt tên thủ tục:

Ví dụ: CustomProcedureStartsWith = '{1}cust_{0}_' ProcedurePrefix = "usp_" Điều này sẽ phù hợp với bất kỳ thủ tục bắt đầu với usp_cust_TableName_GetByAnyMethod; 
{1}cust_{0}_GetByAnyMethod Các phương thức thích hợp sẽ được tạo ra cho thủ tục lưu trữ. 

Ví dụ về thủ tục phù hợp:

create procedure _Employee_GetByBirthdate @birthDate dateTime As 
Select * from Employee where birthDate = @birthdate GO

Vì vậy, khi bạn bắt đầu gene bạn sẽ nhận được phương thức thích hợp tạo ra cho bạn trong EmployeeProvider DAL.

DateTime today = DateTime.Today; 
TList<Employee> todaysBirthdayList = DataRepository.EmployeeProvider.GetByBirthdate(today);

Xác nhận dữ liệu trả về từ tùy chỉnh thủ tục lưu trữ.

Khi tùy chỉnh thủ tục lưu trữ được tìm thấy để đưa vào, chúng ta sẽ kiểm tra các lệnh và xem kiểu kết quả thiết lập trả lại. Bạn có tùy chọn trả lại một trong 3 loại sau đây, TList của các thực thể, DataSet, hoặc IDataReader. 
Quy tắc cho kiểm tra dữ liệu trả lại. - Nếu các thủ tục tùy chỉnh trả về tất cả các cột tương tự như bảng, thì bộ sưu tập các thực thể được trả về. 

Chú ý: Mỗi cột của thực thể phải được bao gồm trong tập hợp kết quả trả về. -Nếu bạn quay trở lại chỉ có một vài cột, hoặc có thể tham gia với một vài bảng khác, thì cấu hình kiểu CustomNonMatchingReturnType sẽ được trả lại. Vì vậy, đây sẽ là một trong hai DataSet hoặc IDataReader. 

Nâng cao:

Connection String động:

Tôi có cơ sở dữ liệu cho tất cả client hoặc người sử dụng với cấu trúc cùng một bảng,... Làm thế nào tôi có thể thay đổi chuỗi kết nối của tôi ở Runtime trong DataRepository? 

Ví dụ:

DataRepository.AddConnection("Vendor1DynamicCS", "Data Source=(local);Initial Catalog=Vendor1Northwind;Integrated Security=true;");

TList<Info> list = DataRepository.Connections["Vendor1DynamicCS"].Provider.InfoProvider.GetAll() 

Nhiều mục Dịch vụ NetTiers

Làm thế nào tôi có thể cấu hình nhiều configSections netTiersService cho nhiều cơ sở dữ liệu trong app/web.config? 
Bạn phải thiết lập tên của configSections với tên của các assembly liên quan trong section. 

Ví dụ:

<configSections>
<section name="Orders.Data" type="Orders.Data.Bases.NetTiersServiceSection, Orders.Data" allowDefinition="MachineToApplication" restartOnExternalChanges="true" />

<section name="Inventory.Data" type="Inventory.Data.Bases.NetTiersServiceSection, Inventory.Data" allowDefinition="MachineToApplication" restartOnExternalChanges="true" />
</configSections>

<connectionStrings>
<add name="connectionStringOrders" connectionString="database=Orders;Integrated Security=true;Connection Timeout=1;server=.;" />

<add name="connectionStringInventory" connectionString="database=Inventory;Integrated Security=true;Connection Timeout=1;server=.;" />

</connectionStrings>

<Orders.Data defaultProvider="SqlNetTiersProvider">
<providers>
<add name="SqlNetTiersProvider" type="Orders.Data.SqlClient.SqlNetTiersProvider, Orders.Data.SqlClient" connectionStringName="connectionStringOrders" useStoredProcedure="false" providerInvariantName="System.Data.SqlClient" />
</providers>
</Orders.Data>

<Inventory.Data defaultProvider="SqlNetTiersProvider2">
<providers>
<add name="SqlNetTiersProvider2" type="Inventory.Data.SqlClient.SqlNetTiersProvider, Inventory.Data.SqlClient" connectionStringName="connectionStringInventory" useStoredProcedure="false" providerInvariantName="System.Data.SqlClient" />
</providers>
</Inventory.Data>

Làm thế nào tôi có thể tự động tạo ra NetTiersProvider trong Runtime mà không cần phải sử dụng cấu hình?

Trong trường hợp bạn không thể truy cập vào cấu hình bạn có thể sử dụng phương thức public LoadProvider của DataRepository. Dưới đây là một ví dụ về cách bạn sẽ nạp các nhà cung cấp trong Runtime. 

Ví dụ:

SqlNetTiersProvider provider = new SqlNetTiersProvider();
NameValueCollection collection = new NameValueCollection();
collection.Add("UseStoredProcedure", "false");
collection.Add("EnableEntityTracking", "true");
collection.Add("EntityCreationalFactoryType", "Northwind.Entities.EntityFactory");
collection.Add("EnableMethodAuthorization", "false");
collection.Add("ConnectionString", "server=.\\Sql2000;database=Northwind;Integrated Security=true;");
collection.Add("ConnectionStringName", "MyDynamicConnectionString");
collection.Add("ProviderInvariantName", "System.Data.SqlClient");

provider.Initialize("DynamicSqlNetTiersProvider", collection);

DataRepository.LoadProvider(provider, true);

TList<Orders> list = DataRepository.OrdersProvider.GetAll();
Response.Write(list.Count.ToString());

Làm thế nào tôi có thể thiết lập nhà cung cấp khác như các nhà cung cấp mặc định trong Runtime?

NetTiersProvider provider = DataRepository.Providers["MyDynamicProvider"];
DataRepository.LoadProvider(provider, true);

Bài tiếp theo, chung ta sẽ cùng nghiên cứu lớp Bussiness Component. Nơi bạn sẽ tìm thấy mã điều khiển: quy trình nghiệp vụ, quy trình làm việc, ủy quyền, sức mạnh ứng dụng, và API dữ liệu của bạn. Nó là huyết mạch của toàn bộ ứng dụng của bạn.

Nguồn bài viết: DOTNET.VN

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML