Как сделать: сохранение данных в Windows Phone - PullRequest
4 голосов
/ 02 декабря 2011

Я пишу приложение для Windows Phone.Я хочу, чтобы при запуске приложения оно получало некоторые данные (настройки или что-то еще), и я хочу, чтобы эти данные сохранялись в течение всего жизненного цикла приложения;то есть я не хочу продолжать читать IsolatedStorage или вызывать сервер всякий раз, когда мне нужен этот фрагмент данных.

Каков наилучший способ сделать это (загрузить и поделиться)?Имея в виду следующее:

  1. Я хочу, чтобы он был совместим с MVVM
  2. Я использую Caliburn.Micro
  3. Данные не только для чтения.
  4. Приложение имеет более одной страницы / View и ViewModels, которые совместно используют данные

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 02 декабря 2011

Статический класс, как упоминает Фил, - хорошая идея, но я бы посоветовал изучить использование внедрения зависимостей.Вам может не понадобиться полный контейнер IoC, но это, вероятно, поможет вашему сценарию.Caliburn.Micro позволяет легко интегрировать такой контейнер.

Создать класс Settings.(Я бы также создал интерфейс ISettings, чтобы вы могли передавать настройки заглушек в модели представлений для тестирования, но это дополнительный бонус.) Затем сделайте так, чтобы все ваши модели ViewModel требовали экземпляра ISettings в своих конструкторах.

Когда ваше приложение запускается, вы создаете один экземпляр Settings, который читает из IsolatedStorage или где у вас есть настройки, а затем передаете этот экземпляр в любой созданный ViewModel.

Этот Settings классможет отвечать за сохранение настроек обратно в IsolatedStorage всякий раз, когда это необходимо.

Пример этого сценария:

В AppBootstrapper class:

PhoneContainer container;
ISettings settings;

protected override void Configure()
{
    // Your usual stuff go here

    settings = new Settings();
    settings.LoadSettings();
    container.Instance(settings);
}

В вашей ViewModelкласс:

ISettings settings;

public MainPageViewModel(ISettings settings)
{
    this.settings = settings;
}

На этом этапе вам будут доступны все настройки для вашей ViewModel.

1 голос
/ 03 декабря 2011

В Caliburn micro мне нравится создавать класс SharedData и регистрировать его в контейнере как одиночный. Затем внедрите его в любые ViewModels, которые должны его использовать. Служба навигации в CM также упрощает передачу данных между страницами с помощью .WithParam.

Редактировать: Я только что понял, что это в основном то, что сказал Деннис. Я также упоминаю, что я также использую SterlingDB для сохранения некоторых вещей между ViewModels.

1 голос
/ 02 декабря 2011

Если я правильно понял ваш вопрос, вы можете использовать статический класс со статическими членами в нем.Пока вы ссылаетесь на этот класс, где вы хотите использовать члены, они будут существовать, пока приложение работает.

Я обновлю ответ другим решением, если я неправильно понял "жизнь приложения«

0 голосов
/ 03 декабря 2011

Я неправильно понял, что такое Caliburn - я думал, по какой-то причине, это был контейнер DI.Так как это не так, то я бы рекомендовал использовать один.Лично я бы использовал OpenNETCF IoC , потому что я знаком с ним, но любой поддерживаемый контейнер будет работать.При инициализации приложения загрузите ваши настройки и любые другие службы, которые вы хотите использовать на весь срок службы приложения, и поместите их в контейнер DI (или попросите контейнер создать их для вас).

Для IoC, который будет выглядеть следующим образомв инициализации приложения:

// assuming MySettings will initialize itself in the ctor
RootWorkItem.Services.AddNew<MySettings, IMySettings>();

или

var settings = new MySettings();
// init settings here
RootWorkItem.Services.Add<IMySettings>(settings);

Затем в любом месте приложения все, что вам нужно, вы тянете (разрешаете) по типу интерфейса:

var settings = RootWorkItem.Services.Get<IMySettings>();

И используйте возвращенный экземпляр.Вы также можете использовать конкретный тип вместо интерфейса во всех случаях, но я предпочитаю использовать интерфейсы, чтобы упростить тестирование и макетирование.

...