Представьте себе приложение WebForms, где есть основной метод с именем CreateAll(). Я могу описать процесс задач метода шаг за шагом следующим образом:
1) Магазины в базу данных (обновить/создать элементы Db 3-4 раза)
2) Начинает новый поток
3) Result1 = Вызывает услугу мыла и с помощью порога тайм-аута проверяет состояние и после x минут. Он продолжает (статус теперь в порядке, и это не означает отказ)
4) Магазины в базу данных (обновить/создать элементы Db в 3-4 раза)
5) result2 = Вызывает услугу мыла (в режиме огня и забывания)
6) Обновляет файл конфигурации (который фактически берется из result1)
7) Используя обратные вызовы, он проверяет каждый х секунд на передней части состояние результата2, и пользовательский интерфейс показывает индикатор выполнения. Если процесс завершен (100%), это означает успех
Я рассматриваю, что все они являются задачами, которые могут быть сгруппированы по их типу. Как правило, несколько типов действий:
- Тип1: транзакция DB
- Тип2: служебная связь/транзакция
- Тип3: операции ввода-вывода файла конфигурации
Я хочу добавить механизм отката/повтора в существующую реализацию и использовать целевую архитектуру и реорганизовать существующий унаследованный код.
Я обнаружил, что для этой цели может помочь что-то вроде шаблона проектирования Memento Design ИЛИ Command в С#. Я также нашел шаблон msdn Retry Pattern описание интересно. Я не знаю, и я хочу, чтобы кто-то привел меня к самому безопасному и лучшему решению...
Можете ли вы предложить мне лучший способ для этого случая сохранить существующую реализацию и поток, но обернуть его в общую и абстрактную реализацию retry/rollback/tasklist?
Окончательная реализация должна иметь возможность повторять в каждом случае (независимо от задачи или общего сбоя, например, таймаута и т.д. в течение всего процесса createAll), а также будет список решений отката, в котором приложение должно иметь возможность откатывать все задачи это было выполнено.
Я хочу несколько примеров, как разбить этот связанный код.
PseudoCode, который может быть полезен:
class something
{
static result CreateAll(object1 obj1, object2 obj2 ...)
{
//Save to database obj1
//...
//Update to database obj1
//
//NEW THREAD
//Start a new thread with obj1, obj2 ...CreateAll
//...
}
void CreateAllAsync()
{
//Type1 Save to database obj1
//...
//Type1 Update to database obj2
//Type2 Call Web Service to create obj1 on the service (not async)
while (state != null && now < times)
{
if (status == "OK")
break;
else
//Wait for X seconds
}
//Check status continue or general failure
//Type1 Update to database obj2 and obj1
//Type2 Call Web Service to create obj2 on the service (fire and forget)
//Type3 Update Configuration File
//Type1 Update to database obj2 and obj1
//..
return;
}
//Then the UI takes the responsibility to check the status of result2