MVVM共享代码Win8和WP8以及文件访问
本文关键字:文件 访问 WP8 共享 代码 Win8 MVVM | 更新日期: 2023-09-27 18:22:24
我正在做一个小项目,我想在那里学习代码共享方法。此解决方案包括Win8和WP8项目。
我需要从存储在特定设备内存中的XML文件加载数据。(Package.Current.InstalledLocation.Path-Win8和IsolatedStorage-VP8),我正在与PCL合作,在程序集级别共享代码。
我还想使用存储库模式从XML文件中获取数据但如果每个系统(Win8和WP8)都有不同的文件访问方法,我也计划使用类似IFileStorage的东西,但我不知道如何以良好的方式连接这两者,以便能够在ViewModel的具体项目中使用特定的IFileStorage。我使用的是MVVM Light Toolkit,这里是这个解决方案的GitHub回购。
我会考虑使用MvvmCross插件。这些功能与您提到的完全一样,并且有一个共享的可移植类库可以使用的接口,然后有特定于平台的版本,可以放在IOC容器中。
MvvmmCross插件在这里:https://github.com/slodge/MvvmCross/tree/v3/Plugins/Cirrious
MvvmmCross在这里:https://github.com/slodge/MvvmCross
您提到您正在使用Mvvm Light。Oren Novotney有一个便携式Mvvm库,您可以在便携式类库中使用。在这里查看。
您的下一步将是设计特定于平台的实例将实现的控制器接口。然后,您所要做的就是在appinit中注册特定于平台的控制器。可移植库将能够直接访问它们,并且您可以拥有特定于平台的实现。
您可以使用WinRT API
访问WP8和Win8:中的文件
public class LocalFileStorage: IRepository<byte[]>
{
private readonly string _fileName;
public LocalFileStorage(string fileName)
{
_fileName = fileName;
}
public async Task<byte[]> LoadAsync()
{
try
{
var file = await GetFileAsync();
using (var stream = await file.OpenStreamForReadAsync())
{
var buffer = new byte[stream.Length];
await stream.ReadAsync(buffer, 0, buffer.Length);
return buffer;
}
}
catch (Exception e)
{
throw new RepositoryException("Unable load data from repository", e);
}
}
public async Task SaveAsync(byte[] buffer)
{
try
{
var file = await GetFileAsync();
using (var stream = await file.OpenStreamForWriteAsync())
{
await stream.WriteAsync(buffer, 0, buffer.Length);
}
}
catch (Exception e)
{
throw new RepositoryException("Unable save data to repository", e);
}
}
private async Task<StorageFile> GetFileAsync()
{
StorageFile file = null;
var notFound = false;
try
{
file = await ApplicationData.Current.LocalFolder.GetFileAsync(_fileName);
}
catch (FileNotFoundException)
{
notFound = true;
}
if (notFound)
{
file = await ApplicationData.Current.LocalFolder.CreateFileAsync(_fileName);
}
return file;
}
}
我使用Factory
为ViewModel
:创建存储库
public class FileStorageFactory: IRepositoryFactory
{
private const string SOME_FILE_NAME_1 = "FileName1.xml";
private const string SOME_FILE_NAME_2= "FileName2.xml";
public IRepository<byte[]> CreateFor1()
{
return new LocalFileStorage(SOME_FILE_NAME_1 );
}
public IRepository<byte[]> CreateFor2()
{
return new LocalFileStorage(SOME_FILE_NAME_2);
}
}