2011-06-08 25 views
5

Tôi đang làm việc thông qua một mẫu mã và tôi chỉ muốn nghe một số ý kiến ​​về cách họ đã làm mọi thứ. Họ sử dụng ADO.NET cũ. Họ có một chức năng chung gọi là Đọc mà mang lại 1 hồ sơ. Đây là mã:Tạo phương pháp truy xuất chung để trả về 1 bản ghi

public static T Read<T>(string storedProcedure, Func<IDataReader, T> make, object[] parms = null) 
{ 
    using (SqlConnection connection = new SqlConnection()) 
    { 
     connection.ConnectionString = connectionString; 

     using (SqlCommand command = new SqlCommand()) 
     { 
     command.Connection = connection; 
     command.CommandType = CommandType.StoredProcedure; 
     command.CommandText = storedProcedure; 
     command.SetParameters(parms); 

     connection.Open(); 

     T t = default(T); 
     var reader = command.ExecuteReader(); 
     if (reader.Read()) 
      t = make(reader); 

     return t; 
     } 
    } 
} 

Tôi không biết lý do tại sao:

  • Họ sử dụng Func<IDataReader, T> make như một phần của phương pháp chữ ký? Có hiệu quả để làm điều đó như thế này không? Có cách nào tốt hơn/thực hành tốt nhất để làm điều này?
  • Tôi không hiểu T t = default(T);? Có hiệu quả để làm điều đó như thế này không? Có cách nào tốt hơn/thực hành tốt nhất để làm điều này?
  • t = make(reader); làm gì? Có hiệu quả để làm điều đó như thế này không? Có cách nào tốt hơn/thực hành tốt nhất để làm điều này?

Chức năng gọi điện thoại sẽ giống như thế này:

public Customer GetCustomer(int customerId) 
{ 
    // Other code here 
    string storedProcedure = "MyStoredProcedure"; 
    object[] parameters = { "@CustomerId", customerId }; 
    return Db.Read(storedProcedure, Make, parameters); 
} 

private static Func<IDataReader, Customer> Make = reader => 
new Customer 
{ 
    CustomerId = reader["CustomerId"].AsId(), 
    Company = reader["CompanyName"].AsString(), 
    City = reader["City"].AsString 
}; 

Tôi không hiểu được một phần Func Make? Ai đó có thể vui lòng giải thích cho tôi những gì đang xảy ra ở đây và nếu đây là thực hành tốt. Bất kỳ thay đổi nào sẽ được đánh giá cao, nhưng vui lòng cung cấp mã mẫu chi tiết :)

Trả lời

3

Đại biểu cho make (materialization) là khá linh hoạt và linh hoạt, nhưng IMO làm cho một chút công việc không cần thiết trong phần lớn các trường hợp. Trong điều khoản của nó hiện - họ sử dụng các đại biểu như một gọi lại để có được người gọi để xác định làm thế nào để đọc hồ sơ.

Lưu ý, vì họ không mong đợi người tiêu dùng đến thay đổi số, có lẽ họ nên để lộ IDataRecord, chứ không phải IDataReader (bất kỳ người đọc nào cũng thực hiện bản ghi).Lưu ý rằng nếu có bất kỳ thông báo lỗi nào trong luồng TDS sau bản ghi đầu tiên, cách tiếp cận hiển thị sẽ không nhìn thấy chúng - nhưng đó là trường hợp cạnh. Nếu bạn muốn giảm thiểu chống lại điều đó, bạn có thể đọc đến cuối dòng TDS:

while(reader.NextResult()) {} 

Cá nhân, tuy nhiên, tôi chỉ muốn sử dụng hoạt bát-dot-net ở đây - tránh phải viết rằng mỗi loại mã theo cách thủ:

var cust = connection.Query<Customer>("MyStoredProcedure", 
    new { CustomerId = customerId }, 
    commandType: CommandType.StoredProcedure).Single(); 

này thực hiện MyStoredProcedure như một sproc, đi qua trong @CustomerId với giá trị từ customerId, sau đó áp dụng một cột trực tiếp < ===> tài sản/lĩnh vực phù hợp để tạo ra Customer hồ sơ, sau đó khẳng định rằng có chính xác một kết quả - và trả về nó.

2

Chúng sử dụng Func làm ký hiệu phương pháp? Có hiệu quả để làm điều đó như thế này không? Có cách nào tốt hơn/thực hành tốt nhất để làm điều này?

Do tính chất chung của phương pháp T không xác định nên không biết cách ánh xạ người đọc trở lại T thuộc tính. Vì vậy, họ để lại trách nhiệm này cho người gọi của phương pháp. Trên thực tế điều này là đủ hiệu quả và đó là thực hành tốt.

Tôi không hiểu T t = mặc định (T) ;? Có hiệu quả để làm điều đó như thế này không? Có cách nào tốt hơn/thực hành tốt nhất để làm điều này?

T có thể là giá trị hoặc loại tham chiếu bạn không thể gán giá trị đó cho giá trị rỗng. default(T) trả về giá trị mặc định cho loại này.Trong trường hợp loại tham chiếu, giá trị này sẽ là rỗng. Trong trường hợp của một loại giá trị, ví dụ như số nguyên, nó sẽ là 0.

T = make (reader); làm gì? Có hiệu quả để làm điều đó như thế này không? Có cách nào tốt hơn/thực hành tốt nhất để làm điều này?

Nó gọi đại biểu được chuyển và gán kết quả là t.

Các vấn đề liên quan