Я пытаюсь найти пример «наилучшей практики» по использованию Xamarin.Forms, ReactiveUI и Akavache в сценарии реального мира.Допустим, есть простая страница, представляющая детали клиента.Он должен извлекать данные с сервера при активации (навигация к).Мне нравится идея метода расширения GetAndFetchLatest от Akavache, поэтому я хотел бы использовать его.
В итоге я получил что-то вроде этого:
public class CustomerDetailViewModel : ViewModelBase //(ReactiveObject, ISupportsActivation)
{
private readonly IWebApiClient webApiClient;
public Customer Customer { get; }
public ReactiveCommand<Unit, Unit> GetDataCommand { get; }
public CustomerDetailViewModel(Customer customer, IWebApiClient webApiClient = null)
{
this.Customer = customer;
this.webApiClient = webApiClient ?? Locator.Current.GetService<IWebApiClient>();
GetDataCommand = ReactiveCommand.CreateFromTask(GetData);
}
private Task GetData()
{
BlobCache.LocalMachine.GetAndFetchLatest($"customer_{Customer.Id.ToString()}",
() => webApiClient.GetCustomerDetail(Customer.Id))
.Subscribe(data =>
{
CustomerDetail = data;
});
return Task.CompletedTask;
}
private CustomerDetail customerDetail;
public CustomerDetail CustomerDetail
{
get => customerDetail;
set => this.RaiseAndSetIfChanged(ref customerDetail, value);
}
}
DTOs
public class Customer
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class CustomerDetail
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
Просмотр привязки
this.WhenActivated(disposables =>
{
this.OneWayBind(this.ViewModel, x => x.Customer.Name, x => x.nameLabel.Text)
.DisposeWith(disposables);
this.OneWayBind(this.ViewModel, x => x.CustomerDetail.Description, x => x.descriptionLabel.Text)
.DisposeWith(disposables);
this.ViewModel?.GetDataCommand.Execute().Subscribe();
}
Но я думаю, что это не 100% пуленепробиваемое.Возможны следующие проблемы:
- Можно ли вызвать
this.ViewModel?.GetDataCommand.Execute().Subscribe();
в this.WhenActivated(d => ...)
в представлении, когда я хочу загрузить данные при активации? - Привязка к
CustomerDetail.Description
может вызвать NullReferenceException
Я прав?Или это безопасно? - Я хочу сделать что-то вроде: «Если есть
CustomerDetail
, покажите CustomerDetail.Name
. Когда он еще не загружен, покажите Customer.Name
».Нужно ли из-за этого создавать определенное свойство в ViewModel? - Как указать загрузку?
- Я что-то упустил здесь?У меня могут быть другие проблемы с этим?