У меня были проблемы с поиском простого гибкого шаблона, позволяющего мне писать в моих моделях ViewModel код, который во время выполнения будет выполняться асинхронно, но во время тестирования - синхронно.Это то, что я придумал - у кого-нибудь есть предложения?Это хороший путь, чтобы пойти вниз?Существуют ли лучше существующие шаблоны?
Определение LongRunningCall:
public class LongRunningCall
{
public Action ExecuteAction { get; set; }
public Action PostExecuteAction { get; set; }
public LongRunningCall(Action executeAction = null, Action postExecuteAction = null)
{
ExecuteAction = executeAction;
PostExecuteAction = postExecuteAction;
}
public void Execute(Action<Exception> onError)
{
try
{
ExecuteAction();
PostExecuteAction();
}
catch (Exception ex)
{
if (onError == null)
throw;
onError(ex);
}
}
public void ExecuteAsync(TaskScheduler scheduler, Action<Exception> onError)
{
var executeTask = Task.Factory.StartNew(ExecuteAction);
var postExecuteTask = executeTask.ContinueWith((t) =>
{
if (t.Exception != null)
throw t.Exception;
PostExecuteAction();
}, scheduler);
if (onError != null)
postExecuteTask.ContinueWith((t) => { onError(t.Exception); });
}
}
Использование:
var continueCall = new LongRunningCall(continueCommand_Execute, continueCommand_PostExecute);
if (svc.IsAsyncRequired)
continueCall.ExecuteAsync(TaskScheduler.FromCurrentSynchronizationContext(), continueCommand_Error);
else
continueCall.Execute(continueCommand_Error);
единственное реальное предварительное условие - это то, что вам нужно знать во время выполнения, если вы должны использовать async / sync.Когда я запускаю свои модульные тесты, я отправляю макет, который говорит, что мой код запускается синхронно, когда приложение на самом деле выполняет IsAsyncRequired по умолчанию true;
Feedback?