0

我正在做一个小项目,我想在那里学习代码共享方法。此解决方案包括 Win8 和 WP8 项目。

我需要从存储在特定设备内存中的 XML 文件中加载数据。(Package.Current.InstalledLocation.Path - Win8 和IsolatedStorage - WP8)我正在使用 PCL 在程序集级别共享代码。

我也想使用存储库模式从 XML 文件 中获取数据,但如果每个系统(Win8 和 WP8)都有不同的文件访问方法,我还计划使用IFileStorage 之类的东西,但我不知道如何将这两者连接起来能够在 ViewModel 的具体项目中使用特定 IFileStorage 的好方法。我正在使用 MVVM Light Toolkit,这是此解决方案的 GitHub 存储库。

4

3 回答 3

2

我会考虑使用 MvvmCross 插件。这些功能与您提到的完全一样,并且具有您的共享可移植类库使用的接口,然后具有可以放置到 IOC 容器中的特定于平台的版本。

MvvmCross 插件在这里: https ://github.com/slodge/MvvmCross/tree/v3/Plugins/Cirrious

MvvmCross 在这里: https ://github.com/slodge/MvvmCross

于 2013-07-16T08:50:26.900 回答
1

你提到你正在使用 Mvvm Light。Oren Novotney 有一个可移植的 Mvvm 库,您可以在可移植类库中使用它。在这里查看。

您的下一步将是设计您的平台特定实例将实现的控制器接口。然后,您所要做的就是在 app init 中注册特定于平台的控制器。可移植库将能够直接访问它们,并且您可以拥有特定于平台的实现。

于 2013-07-16T23:08:19.863 回答
0

您可以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;
        }
    }

我使用 aFactory为 a 创建存储库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);
        }
    }
于 2013-07-16T08:46:58.127 回答