【问题标题】:How to use PCLStorage in Portable class library?如何在可移植类库中使用 PCLStorage?
【发布时间】:2014-03-24 06:49:58
【问题描述】:

我有一个便携式类库,我打算将它用于 Windows 8 和手机应用程序。所以我创建了一个通用的视图模型,现在我想处理视图模型中的存储功能。我找到了一个用于处理这种情况的 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;
        }
    }

我找到了一种方法,我为视图模型中使用的存储创建了一个接口。并创建了一个类来处理各个项目中电话和地铁的存储。当我创建 MainViewModel 的对象时,我也在传递存储对象。

所以我想知道,这样对吗?

【问题讨论】:

  • 你能告诉我为什么你使用 PLC 存储而不是 Windows.Storage 命名空间吗?还是手机的隔离存储(System.IO.Storage)?
  • Windows.Storage 在 PCL 中不可访问。

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


【解决方案1】:

我相信最简单的模式是在平台的“特定”“外壳”上的容器引导程序中注册 current-platform-defendant-implementation 并在构造函数中获取依赖关系 或者干脆跳过 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(":<");
        }
    }'

【讨论】:

  • 一切都在我身上流淌,我不像你那么有才华。所以请详细解释或给出其他解决方案。
【解决方案2】:

我找到了一种方法,我为视图模型中使用的存储创建了一个接口。并创建了一个类来处理各个项目中电话和地铁的存储。当我创建 MainViewModel 的对象时,我也在传递存储对象。所以我想知道这样对吗?

是的,这是一个很好的解决方案。 Dan 的回答基本上是一样的,只是使用了 IoC 容器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2014-07-10
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多