Доброго времени суток всем.
Есть клиент-серверное приложение устроенное следующим образом.
Есть интерфейс представляющий модель примерно такой (C#).
interface IModel
{
byte[] GetData();
IAsyncResult BeginGetData(AsyncCallback callback);
byte[] EndGetData(IAsyncResult ar);
}
На клиентской стороне, его реализует прокси, которые ходит к серверу через Web-service.
На серверной стороне, его реализует класс ходящий к базе и содержащий, собственно, логику приложения.
Получается такая схема работы
1. Пользователь жмет кнопку на View (Windows forms)
2. View вызывает метод у Presenter-а, или, если хотите, Controllera.
3. Controller вызывает асинхронный метод IModel.BeginGetData( On_GetDataCompleted ). Никаких лишних потоков, все счастливы.
4. На серверной стороне транспортный уровень вызывает синхронный метод IModel.GetData и пересылает данные клиенту.
5. На клиентской стороне вызывается метод On_GetDataCompleted, берем данные, которые вернул сервер, меняем состояние View.
Теперь стоит задача, сделать Web(AJAX) клиента к этому приложению. Класс Controller-а переезжает на серверную сторону и начинает общаться с моделью через интерфейс IModel напрямую, без посредников. Теперь, когда приходит запрос из браузера, создается экземпляр View и он вызывает метод Controller-а. А Controller, как было написано выше, вызывыет асинхронный метод IModel.BeginGetData и создает еще один, абсолютно не нужный поток на сервере.
Вариантов решения видится несколько.
0. Переделываем Controller, чтобы он всегда вызывал синхронные методы IModel (по факту удаляем асинхронные методы из IModel). На Windows forms клиенте View вызывает методы Controller-а асинхронно (чтобы не вис GUI) и мы миримся с тем, что висит поток ожидающий ответа от сервера. На Web клиенте радуемся жизни.
1. Заводим у Controller-а синхронные и асинхронные методы которые вызывают соответствующие методы IModel. View на обычном клиенте будет вызывать асинхронные методы, а на Web синхронные. (На самом деле у нас нет методов у Controller-а, это я для простоты написал, а есть события View которые Controller обрабатывает. Как завести синхронные и асинхронные события у View тот еще вопрос

)
2. Заводим у Controller-а режим работы, синхронный или асинхронный. Сигнатуры методов не меняем. При создании выставляем ему режим работы. Усложняем Controller.
3. Создаем базовую реализацию Controller-а. А для разных клиентов создаем наследников/обертки, которые будут вызывать разные методы IModel, а результаты отдавать в базовую реализацию. Еще сильнее усложняем Controller. Перетестируем его для разных клиентов.
4. Серверная реализация IModel асинхронные методы реализует как обычные. Все равно асинхронные методы Windows forms клиентом не используются. Какая-то злая заточка
5. Какие еще методы решения данной проблемы вы предложите?
Какой бы метод решения выбрали вы? И если не сложно, напишите, почему.
спасибо