Tôi rất hào hứng khi tạo ứng dụng đầu tiên của mình với C# 5.0 và tôi muốn sử dụng các từ khóa không đồng bộ/chờ đợi để giảm bớt các cơn phiền toái của các cuộc gọi dữ liệu không đồng bộ.Việc thiếu từ khóa không đồng bộ trong các giao diện có phá vỡ DI trong C# 5.0 không?
Tôi hơi bối rối khi giao diện không cho phép từ khóa async là một phần của hợp đồng, vì từ khóa chờ đợi chỉ hoạt động cho các phương thức được đánh dấu không đồng bộ. Điều này có nghĩa là không thể gọi các phương thức không đồng bộ thông qua các tham chiếu giao diện. Điều này cũng đi cho các phương pháp trừu tượng. Am i thiếu cái gì ở đây? Điều này có nghĩa rằng thường xuyên DI-công cụ của tôi sẽ không còn làm việc:
IAsyncRepository<T> {
Task<IList<T>> GetAsync(); // no 'async' allowed
}
abstract class AsyncRepositoryBase<T> {
public abstract Task<IList<T>> GetAsync(); // no 'async' allowed
// mã khách hàng:
IAsyncRepository<Model> repo = ioc.Resolve<IAsyncRepository<Model>>();
var items = await repo.GetAsync(); // DOOOOOH, will not compile!
Đây là giải pháp hiện tại của tôi:
public abstract class AsyncRepositoryBase<T>
{
protected Task<IList<T>> _fetcherTask;
protected AsyncRepositoryBase(Task<IList<T>> fetcherTask)
{
_fetcherTask = fetcherTask;
}
public virtual async Task<IList<T>> GetASync()
{
return await _fetcherTask;
}
}
Tôi có phải chọn giữa trừu tượng và tính năng langauge? Vui lòng cho tôi biết tôi đang thiếu thứ gì đó.
Bất kỳ sự trừu tượng nào bị rò rỉ theo cách này hay cách khác. Nhưng nó không phải là một vấn đề, bạn chỉ phải cung cấp một cách để thực hiện các mô hình async. Trả lại IAsyncResult là đủ. –