Arayüz ve asenkron tasarımı


9

Diyelim ki IFolderRepositoryböyle yöntemlerle arayüz oluşturdum :

IEnumerable<Folder> GetAllFolders();
Folder GetFolderWithId(int id);
void AddFolder(Folder newFolder);
void ModifyFolder(Folder folderToModify, Folder folderAfterModification);
void RemoveFolder(Folder folderToRemove);

ve uyguladım DatabaseFolderRepositoryve diyelim CacheFolderRepositoryDecorator. Şimdi 'yüzlerce satır sonra' SkyDrive klasörlerini işlevsellik eklemek istiyorum, böylece eklemeye hazırım SkyDriveFolderRepository. Maalesef ise DatabaseFolderRepositoryuygulama veritabanı ile konuşmak için senkron yöntemler kullanılır, SkyDrive biri bir çok kullanır asyncve await. Bu durumda ne yapmalı? Geçersiz yöntemlerin zaman uyumsuz olarak işaretlenmesi durumunda bir çözüm değildir (özel durum işleme gerekir). Geri dönmek için arayüzü değiştirmeli miyim Task<T>? Elbette yukarıdaki örnekte işe yarayacaktır, ancak bunlar sadece 2 arayüz uygulama sınıfıdır. Ya da arayüzlerimin çoğunun Taskdönüş tipleri olmalı (size karşı kuralına ihtiyacınız olmayacak)?


Sorunuzla alakasız (üzgünüm), ancak bir IFolderarayüzünüz varsa, neden Foldertüm yöntemlerinizde somut uygulamaya ( ) güveniyorsunuz ?
Konrad Morawski

1
Arayan ne bekliyor? Uyguladığınız API hata kodlarına, istisnalara, geri aramalara mı dayanıyor mu? Değiştirebilir misin?
david.pfx

@KonradMorawski yazım hatasıydı - üzgünüm. İstisnalara dayanıyor ve değiştiremiyorum.
fex

Yanıtlar:


10

Muhtemelen iyi bir okuma için Asenkron uygulamalarla ilgili bu MSDN makalesini bulacaksınız .

Sen sordun:

Maalesef ise DatabaseFolderRepositoryuygulama veritabanı ile konuşmak için senkron yöntemler kullanılır, SkyDrive biri bir çok kullanır asyncve await.

Async All the WayBağlandığım MSDN makalesindeki alt bölüm , durumunuzla ilgili olacaktır.

Özellikle, Task.Wait veya Task.Result öğesini çağırarak zaman uyumsuz kodu engellemek genellikle kötü bir fikirdir. Bu, özellikle ayak parmaklarını eşzamansız programlamaya daldırarak, uygulamalarının sadece küçük bir bölümünü dönüştüren ve senkronize bir API'ye saran programcılar için, uygulamanın geri kalanının değişikliklerden izole edilmesi için özellikle yaygın bir sorundur. Ne yazık ki, kilitlenmelerle ilgili problemlerle karşılaşıyorlar.

Eşzamansız olması gereken en az bir arabiriminiz olduğundan, YAGNI ters çevrilir. Sen olan senin arayüzleri tutarlı olacak şekilde değişiklik yapmak için ihtiyacım. Evet, önünüzde daha fazla çaba yaratacaktır. Ancak fayda daha az kilitlenme riski; daha az karmaşık hata ayıklama; ve daha öngörülebilir engelleme (gerçekten gerçekleşmesi gerektiğinde).

Sorunuzun özünü ele aldığımı düşündüğüm için sorduğunuz diğer soruların bazılarını atlıyorum. Çekirdek ile başa çıkmak ve sorularınızın geri kalanı düşüyor. Makale oldukça ilgiliydi ve ek tuzaklara işaret etmenin yanı sıra, getirdiğiniz diğer noktaları ele alıyor.

Asenkron programlama, tüm kavramı benimsemeniz ve sadece onunla gitmeniz gerekenlerden biridir. Parçalı bir temelde sadece "ayak parmaklarınızı daldırmaya" çalışmak çok daha karmaşık ve daha sonra düz atlamaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.