Предположим, я создал интерфейс 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
) во всех ваших методах?Ответы:
Вы, вероятно, найдете эту статью MSDN об асинхронных практиках хорошей читкой.
Ты спросил:
Именно здесь подраздел
Async All the Way
в статье MSDN, который я связал, будет иметь отношение к вашей ситуации.Поскольку у вас есть хотя бы один интерфейс, который должен быть асинхронным, YAGNI меняется на противоположный. Вы это собирается необходимо внести изменения , чтобы ваши интерфейсы совместимы. Да, это создаст больше усилий для вас. Но выгода - меньше риск тупика; менее сложная отладка; и более предсказуемое блокирование (когда это действительно должно произойти).
Я пропускаю некоторые другие вопросы, которые вы задавали, так как я думаю, что рассмотрел суть вашего вопроса. Разберитесь с ядром, а остальные ваши вопросы отпадут. Эта статья довольно интересна и затрагивает другие затронутые вами вопросы, а также указывает на дополнительные подводные камни.
Асинхронное программирование является одним из тех, где вы должны охватить всю концепцию и просто пойти с ней. Попытка просто «опустить пальцы» по частям оказывается намного сложнее, чем просто прыгать прямо внутрь.
источник