Предположим, я создал интерфейс IFolderRepositoryс такими методами:
IEnumerable<Folder> GetAllFolders();
Folder GetFolderWithId(int id);
void AddFolder(Folder newFolder);
void ModifyFolder(Folder folderToModify, Folder folderAfterModification);
void RemoveFolder(Folder folderToRemove);
и я реализовал DatabaseFolderRepositoryи скажем CacheFolderRepositoryDecorator. Теперь, «сотни строк спустя», я бы хотел добавить функциональность папок SkyDrive, так что я готов добавить SkyDriveFolderRepository. К сожалению, в то время как DatabaseFolderRepositoryреализация использовала синхронные методы для взаимодействия с базой данных, skydrive one использует много asyncи await. Что делать в таком случае? В случае void методов, помечающих это, асинхронность не является решением (необходимость обработки исключений). Должен ли я изменить интерфейс, чтобы вернуться Task<T>? Конечно, это будет работать в приведенном выше примере, но это всего лишь 2 класса реализации интерфейса. Или у большинства моих интерфейсов должны быть Taskтипы возврата (против вас это правило не понадобится)?
IFolderинтерфейс, почему вы полагаетесь на конкретную реализацию (Folder) во всех ваших методах?