Entwerfen von Schnittstellen und Async

9

Angenommen, ich habe eine Schnittstelle IFolderRepositorymit folgenden Methoden erstellt:

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

und ich habe implementiert DatabaseFolderRepositoryund sagen wir mal CacheFolderRepositoryDecorator. Jetzt, Hunderte von Zeilen später, möchte ich die Funktionalität von SkyDrive-Ordnern hinzufügen, damit ich sie hinzufügen kann SkyDriveFolderRepository. Während die DatabaseFolderRepositoryImplementierung synchrone Methoden verwendet, um mit der Datenbank zu kommunizieren, verwendet skydrive leider viele asyncund await. Was ist in einem solchen Fall zu tun? Bei ungültigen Methoden ist das Markieren als asynchron keine Lösung (Ausnahmebehandlung erforderlich). Sollte ich die Schnittstelle ändern, um zurückzukehren Task<T>? Sicher, es wird im obigen Beispiel funktionieren, aber es sind nur 2 Schnittstellenimplementierungsklassen. Oder sollten die meisten meiner Schnittstellen TaskRückgabetypen haben (gegen Sie wird es keine Regel brauchen)?

fex
quelle
Unabhängig von Ihrer Frage (sorry), aber wenn Sie eine IFolderSchnittstelle haben, warum verlassen Sie sich Folderbei all Ihren Methoden auf die konkrete Implementierung ( )?
Konrad Morawski
1
Was erwartet Ihr Anrufer? Basiert die von Ihnen implementierte API auf Fehlercodes, Ausnahmen, Rückrufen oder was? Kannst du es aendern?
david.pfx
@KonradMorawski es war Tippfehler - sorry. Es basiert auf Ausnahmen und ich kann es nicht ändern.
Fex

Antworten:

10

Sie werden wahrscheinlich feststellen, dass dieser MSDN-Artikel über asynchrone Praktiken eine gute Lektüre ist.

Du hast gefragt:

Während die DatabaseFolderRepositoryImplementierung synchrone Methoden verwendet, um mit der Datenbank zu kommunizieren, verwendet skydrive leider viele asyncund await.

Hier ist der Unterabschnitt Async All the Waydes von mir verlinkten MSDN-Artikels für Ihre Situation relevant.

Insbesondere ist es normalerweise eine schlechte Idee, asynchronen Code durch Aufrufen von Task.Wait oder Task.Result zu blockieren. Dies ist ein besonders häufiges Problem für Programmierer, die ihre Zehen in die asynchrone Programmierung eintauchen, nur einen kleinen Teil ihrer Anwendung konvertieren und in eine synchrone API einbinden, damit der Rest der Anwendung von den Änderungen isoliert ist. Leider haben sie Probleme mit Deadlocks.

Da Sie mindestens eine Schnittstelle haben, die asynchron sein muss, wird YAGNI umgekehrt. Sie sind Gonna müssen , um Änderungen vorzunehmen , so dass Ihre Schnittstellen konsistent sind. Ja, es wird mehr Aufwand für Sie bedeuten. Der Vorteil ist jedoch das geringere Risiko eines Deadlocks. weniger komplexes Debuggen; und vorhersehbareres Blockieren (wenn es tatsächlich auftreten muss).

Ich überspringe einige der anderen Fragen, die Sie gestellt haben, da ich glaube, ich habe den Kern Ihrer Frage angesprochen. Beschäftige dich mit dem Kern und der Rest deiner Fragen fällt weg. Der Artikel ist ziemlich kompliziert und befasst sich mit den anderen Punkten, die Sie angesprochen haben, sowie mit zusätzlichen Fallstricken.

Asynchrone Programmierung ist eine von denen, bei denen Sie das gesamte Konzept annehmen und einfach mitmachen müssen. Der Versuch, nur stückweise "die Zehen einzutauchen", ist viel komplizierter als nur direkt einzuspringen.


quelle