0

コード共有方法について学びたい小さなプロジェクトに取り組んでいます。このソリューションには、Win8 と WP8 の両方のプロジェクトが含まれます。

特定のデバイスのメモリに保存されている XML ファイルからデータをロードする必要があります。( Package.Current.InstalledLocation.Path - Win8 およびIsolatedStorage - WP8) アセンブリ レベルでコードを共有するために PCL を使用しています。

また、XML ファイルからデータを取得するためにリポジトリ パターンを使用したいと考えています が、すべてのシステム (Win8 と WP8) のファイル アクセス方法が異なる場合、IFileStorage なども使用する予定ですが、これら 2 つを接続する方法がわかりません。 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 に答える
0

WinRT APIWP8 および 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);
        }
    }
于 2013-07-16T08:46:58.127 に答える