Я бы сделал это со свойством только для чтения и методом, который заполняет свойство.
Если вы знаете, что результат понадобится, вы можете загрузить его в начале - во время запуска службы, активации просмотра и т. Д.
Я в основном использую ReactiveUI в приложениях WPF, поэтому это будет выглядеть так:
// ViewModel constructor
GetResult = ReactiveCommand.CreateFromTask(async () => _model.GetResultAsync()); // notice that method is async
// there is also overload with CancelationToken
_result = GetResult.Retry(3).ToProperty(this, x => x.Result); // we can retry few times and we get change notification
GetResult.Subscribe(result =>{
// do something as soon as the result is loaded
});
GetResult.ThrownExceptions.Subscribe( errorHandler);
// ViewModel properties
private ObservableAsProperetyHelper _result;
public ResultType Result => _result.Value;
// view constructor
this.WhenActivated(d =>{ // d is CompositeDisposable for cleanup
ViewModel.GetResult.Execute().Subscribe().DisposeWith(d); // cancel command if the view is deactivated before it's finished
});
Таким образом, вы можете сделать асинхронный вызов в нужный момент и сохранить результат на потом. Вы также можете легко обновить результат - он становится грязным, если использовать только ленивые свойства.
С другой стороны, вы можете легко создать спиннер для загрузки:
_isBusy = GetResult.IsExecuting.ToProperty(this, x => x.IsBusy);
Я следовал этому шаблону в постоянно включенной службе Windows, в которой пользовательский HTTP-сервер работал в фоновом режиме. Вы можете await GetResult.Execute()
, если вы хотите навязать загрузку в определенный момент.
В моей практике этот паттерн демонстрирует очень мало недостатков - главный из них - шаблонный код, но при наличии надлежащих инструментов он может быть написан очень быстро.
Если вы создаете какое-либо приложение типа службы, консоль или что-то еще, шаблон MVVM по-прежнему очень полезен, вы просто не делаете представления.
Существует несколько опций для Вас посмотреть на, в зависимости от которого языка сценариев сборки Вы используете:
В моих текущих клиентах мы используем Buckminster, который переносит PDE-сборку, и назовите его от Ant/CruiseControl. У нас есть код, входящий из нескольких репозиториев все встраиваемые в единственный продукт RCP.
Стандартный способ сделать Сборку Eclipse состоит в том, чтобы использовать Плагин Сборки PDE.
http://wiki.eclipse.org/index.php/PDEBuild
Плагин PDU обычно включается с Eclipse IDE и содержит серию шаблонов. Шаблоны помогают Вам настроить систему, которая будет:
Теоретически все, что необходимо сделать, должно изменить файл customTargets.xml, записать файл карты, который содержит ссылку на каждый плагин, который необходимо проверить и изменить build.properties файл для указания на такие свойства как cvs местоположение сервера.
У меня была подобная проблема к той, которую Вы имеете. Механизм сборки разделен на несколько шагов. Можно настроить цель упреждающей выборки файла customTargets.xml, таким образом, некоторые "объемные" библиотеки импортируются из определенных деревьев в репозитории и добавляют их к каталогу сборки, таким образом, Вы не должны указывать каждый плагин в карте.
Можно использовать Tycho для создания плагинов затмения со Знатоком. Это - то, как плагин M2eclipse создается. Узнайте больше по http://m2eclipse.sonatype.org
Вы могли записать своего рода сценарий, который находит те библиотеки для Вас и помещает их в формат, понятный Муравьем.
Например, это могло создать eclipse.lirbaries.properties файл, затем Вы могли читать в том использовании файла:
<property file="eclipse.libraries.properties" />
Вы могли также использовать атрибут FileSet:
http://ant.apache.org/manual/Types/fileset.html
Или даже комбинация обоих.
1) Назовите скрипт Ant
2) Скрипт Ant называет удар (или безотносительно языка сценариев) сценарием, который создает eclipse.libraries.properties
3) Муравей загружает eclipse.libraries.properties
4) Муравей продолжает сборку