Немного о странных архитектурных решениях

Сейчас у меня основная работа связана с разработкой софтинки на ASP.NET. Во время разработки оной, наткнулся на весьма неприятную штуку, которая теоретически должна была облегчить жизнь всяким программистам, а на самом деле является весьма спорной и даже вредной.

Описание задачи: в .NET framework есть клиент SMTP. Письма он умеет посылать синхронно и асинхронно. Во втором случае можно подкинуть callback, который вызовется со статусом операции. Нужно посылать письма асинхронно, причем хотелось минимальными усилиями. Ну чего нам стоит вызвать SendAsync() вместо Send()? А оказалось, что не все так просто.

Начиная с ASP.NET 2.0 (сейчас на дворе 3.5), разработчики ввели поддержку асинхронных операций в базовый функционал. Но при этом сделали достаточно странное предположение - программе всегда нужен будет результат асинхронной операции до отдачи ответа клиенту. В результате, они сделали такой вот велосипед - программист может запустить несколько асинхронных задач, используя стандартные средства .NET, а страница будет ждать, пока они не завершатся. Кроме того, они запретили (кидается исключение) использование асинхронных задач, если для страницы не поставить флажок Async=”True”.

В целом, подход достаточно странный - у нас бизнес логика лежит в отдельных assembly, и посылка писем оттуда же. Получается, что для отсылки писем асинхронно, через стандартное API, мне прийдется менять уровень представления (хотя бы флажок Async=”true” повесить на все нужные страницы). Что как бы эээ.

Вот такие вот дела.

P.S. Если использовать асинхронную посылку писем вне контекста запроса ASP.NET, то все работает нормально.

blog comments powered by Disqus