Angenommen, ich habe eine Schnittstelle IFolderRepository
mit 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 DatabaseFolderRepository
und 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 DatabaseFolderRepository
Implementierung synchrone Methoden verwendet, um mit der Datenbank zu kommunizieren, verwendet skydrive leider viele async
und 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 Task
Rückgabetypen haben (gegen Sie wird es keine Regel brauchen)?
IFolder
Schnittstelle haben, warum verlassen Sie sichFolder
bei all Ihren Methoden auf die konkrete Implementierung ( )?Antworten:
Sie werden wahrscheinlich feststellen, dass dieser MSDN-Artikel über asynchrone Praktiken eine gute Lektüre ist.
Du hast gefragt:
Hier ist der Unterabschnitt
Async All the Way
des von mir verlinkten MSDN-Artikels für Ihre Situation relevant.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