如何在Portable类库中使用PCLStorage?

时间:2014-03-24 06:49:59

标签: c# windows-8 windows-phone portable-class-library

我有一个便携式类库,我将用于Windows 8和手机应用程序。所以我创建了一个通用的viewmodeland,现在我想在viewmodels中处理存储功能。我找到了一个PCLStorage包,用于处理这种情况。

我在Windows 8上有这样的代码,现在我想用PCLStorage在PCL中写这个。

 public static object LoadSettings(string key)
    {            
        if (Windows.Storage.ApplicationData.Current.LocalSettings.Values.ContainsKey(key))
        {
            if (Windows.Storage.ApplicationData.Current.LocalSettings.Values[key] != null)
            {
                return Windows.Storage.ApplicationData.Current.LocalSettings.Values[key];
            }
            else
            {
                return null;
            }
        }
        else
        {
            return null;
        }
    }

我找到了一种方法,我在viewmodel中创建了一个用于存储的接口。并创建了一个类来处理各个项目中的电话和城域存储。当我创建MainViewModel的对象时,我也传递存储对象。

所以我想知道,这是对的吗?

2 个答案:

答案 0 :(得分:1)

我认为最简单的模式是在容器引导程序中注册当前平台 - 被告 - 实现特定的' '壳' for platform并获取构造函数中的依赖项 或者只是跳过IoC并手动实例化东西

using MyInfrastructureAssembly.Interfaces;
public MyApp: App // MyNewPlatFormApp
{
public override Initiaze()
{
    var bootsrapper =  new Boostrapper(MyIoC.Current);
}
}
public class Bootsrapper: TheBootStrapperOfMyIoc
{ 
   public Bootsrapper(IocContainer container)
   {
    Container = container;
   }
   public override Register()
   {
     Container.Register<IMyAbstractedService,MyPlatformDependantService>();   
   }
} 
MyPlatformDependantService : IMyAbstractedService 
{
public object Get(); // IMyAbstractedService.Get()
}
public class MyViewModel:ViewModelBase
{
IMyService  MyService {get;set;}

MyViewModel(IMyAbstractedService myServcice)
{       
    MyService = myService;
}

public object Thing // LazyThing provided by IMyAbstractedService 
{
    get
    { 
        if(_thing!=null)
        return _thing;
        return _thing = GetIt();
    }
    set 
    {
        if(Equals(value,_thing)) return;
        _thing = value;
        base.NotifyMagicalChanges()
    }
}
    public void GetIt()
{       
    MyServcie.Get();
}
}

静态版:在LinqPad

上运行
enter code here
private async void CheckIfExist()
    {
        try
        {
            var isoStore = FileSystem.Current.LocalStorage;

            var folder = await isoStore.CreateFolderAsync("xxx", 
CreationCollisionOption.ReplaceExisting);                

            ExistenceCheckResult result = await  isoStore.CheckExistsAsync("xxx");

            switch (result)
            {
                case (ExistenceCheckResult.FolderExists):
                    Console.WriteLine(":)"); break;
                case (ExistenceCheckResult.NotFound):
                    Console.WriteLine(":("); break;
            }
        }
        catch (Exception)
        {
            Console.WriteLine(":<");
        }
    }'

答案 1 :(得分:0)

  

我找到了一种方法,我在viewmodel中创建了一个用于存储的接口。并创建了一个类来处理各个项目中的电话和城域存储。当我创建MainViewModel的对象时,我也传递存储对象。所以我想知道这是对的吗?

是的,这是一个很好的解决方案。 Dan的答案与使用IoC容器基本相同。

您还可以尝试使用Xam.Plugins.Settings库,它基本上用于设置PCL存储为文件IO执行的操作。