Tôi khuyên bạn nên xử lý DbCommand
và bạn bè của mình như thể chúng là giao diện khi sử dụng API cơ sở dữ liệu. Vì mục đích khái quát hóa API trên các nhà cung cấp cơ sở dữ liệu khác nhau, DbCommand
đạt được cũng như IDbCommand
—hoặc, được cho là tốt hơn, bởi vì nó bao gồm các công nghệ mới hơn như await
có thể Task
*Async()
thành viên.
MS không thể thêm bất kỳ phương pháp mới nào có chức năng mới vào IDbCommand
. Nếu họ thêm phương thức vào IDbCommand
, đó là một thay đổi đột phá bởi vì bất kỳ ai được tự do triển khai giao diện đó trong mã của họ và MS đã nỗ lực nhiều trong việc bảo toàn khả năng tương thích ABI và API trong khuôn khổ. Nếu họ mở rộng giao diện trong một bản phát hành của .net, mã khách hàng mà trước đây đã làm việc sẽ ngừng biên dịch và hội đồng hiện có mà không được biên dịch lại sẽ bắt đầu gặp phải lỗi thời gian chạy. Ngoài ra, họ không thể thêm các phương thức thích hợp *Async()
hoặc Begin*()
thông qua các phương pháp tiện ích mà không làm xấu đúc đến DbCommand
phía sau hậu trường (chính là hành vi xấu, phá vỡ an toàn loại và giới thiệu thời gian chạy động không cần thiết).
Mặt khác, MS có thể thêm các phương thức ảo mới vào DbCommand
mà không vi phạm ABI. Việc thêm các phương thức mới vào một lớp cơ sở có thể được coi là phá vỡ API (thời gian biên dịch, không phải là xấu để phá vỡ thời gian chạy) vì nếu bạn thừa kế DbCommand
và đã thêm một thành viên có cùng tên, bạn sẽ bắt đầu nhận được cảnh báo CS0108: 'member1' hides inherited member 'member2'. Use the new keyword if hiding was intended.) . Do đó, DbCommand
có thể nhận các tính năng mới với tác động tối thiểu đến mã tiêu thụ tuân theo các phương pháp hay (ví dụ: hầu hết mọi thứ sẽ tiếp tục hoạt động miễn là nó không hoạt động với hệ thống kiểu và phương thức gọi bằng cách sử dụng một cái gì đó như myCommand.GetType().GetMethods()[3].Invoke(myCommand, …)
).
Một chiến lược có thể mà MS có thể đã sử dụng để hỗ trợ những người thích giao diện sẽ giới thiệu giao diện mới với các tên như IAsyncDbCommand
và có DbCommand
triển khai chúng. Họ đã không làm điều này. Tôi không biết tại sao, nhưng họ có thể không làm điều này bởi vì nó sẽ làm tăng sự phức tạp và thay thế trực tiếp tiêu thụ DbCommand
cung cấp hầu hết các lợi ích cho việc tiêu thụ giao diện với một vài nhược điểm. Tức là, nó sẽ hoạt động với một chút trở lại.
Tôi không thấy 'IDbCommand.ExecuteScalarAsync()'. Những gì [tài liệu] (https://msdn.microsoft.com/en-us/library/system.data.idbcommand (v = vs.110) .aspx) bạn đang xem? – binki
Ồ, bạn đang nói ['SqlCommand.ExecuteScalarAsync()'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalarasync%28v=vs.110%29. aspx). Tôi hiểu rồi. – binki
@binki hoặc ['DbCommand.ExecuteScalarAsync()'] (https://msdn.microsoft.com/en-us/library/hh223677 (v = vs.110) .aspx), không hoàn toàn tốt bằng có nó trên giao diện, nhưng không hỗ trợ một số đa hình. – phoog