Добавление Data Persistence
На этой странице, вы добавите немного кода в модель альбома, который будет сохранять на диск, а потом считывать при запуске коллекцию альбомов пользователя.
В качестве приятного бонуса, будет кэширование обложек альбомов. Благодаря чему, они тоже будут считываться с диска (при наличии), а не загружать по Web API.
Модель альбома
Для добавления persistance
сервиса (сохранение и загрузка) в модель альбом, выполните следующие действия:
- Остановите приложение, если оно запущено.
- В папке /Models найдите и откройте файл Album.cs.
- Добавьте код реализации сохранения на диск, как показано ниже:
public async Task SaveAsync()
{
if (!Directory.Exists("./Cache"))
{
Directory.CreateDirectory("./Cache");
}
using (var fs = File.OpenWrite(CachePath))
{
await SaveToStreamAsync(this, fs);
}
}
public Stream SaveCoverBitmapStream()
{
return File.OpenWrite(CachePath + ".bmp");
}
private static async Task SaveToStreamAsync(Album data, Stream stream)
{
await JsonSerializer.SerializeAsync(stream, data).ConfigureAwait(false);
}
- Добавьте код реализации загрузки с диска, как показано ниже:
public static async Task<Album> LoadFromStream(Stream stream)
{
return (await JsonSerializer.DeserializeAsync<Album>(stream).ConfigureAwait(false))!;
}
public static async Task<IEnumerable<Album>> LoadCachedAsync()
{
if (!Directory.Exists("./Cache"))
{
Directory.CreateDirectory("./Cache");
}
var results = new List<Album>();
foreach (var file in Directory.EnumerateFiles("./Cache"))
{
if (!string.IsNullOrWhiteSpace(new DirectoryInfo(file).Extension)) continue;
await using var fs = File.OpenRead(file);
results.Add(await Album.LoadFromStream(fs).ConfigureAwait(false));
}
return results;
}
View Model
альбома
Следующим шаго м, вы добавите метод во view model
альбома, который взаимодействует
со следующими persistence
методами сохранения:
SaveAsync
- сохраняет текстовые данные альбома как JSON-файл,
SaveCoverBitmapStream
- сохраняет обложку в виде файла изображения формата .BMP
.
Для изменения view model
альбома, выполните следующие действия:
- Найдите и откройте файл AlbumViewModel.cs.
- Добавьте метод, как показано ниже:
public async Task SaveToDiskAsync()
{
await _album.SaveAsync();
if (Cover != null)
{
var bitmap = Cover;
await Task.Run(() =>
{
using (var fs = _album.SaveCoverBitmapStream())
{
bitmap.Save(fs);
}
});
}
}
Также обратите внимание,что изображение сохраняется из копии, на случай, если свойство Cover
изменится другим поток во время выполнения операции.