适用于UWP和桌面的便携式存储库

时间:2015-09-27 10:23:14

标签: c# windows-10 win-universal-app portable-class-library

我试图找到一个优雅的解决方案来弥合现有Windows桌面应用程序和Windows 10通用应用程序之间的存储库差距。我现有的应用程序使用本地连接的MDF文件和Entity Framework 6,但我想转向与桌面和通用环境兼容的单个存储库。

我无法在能够提供此功能的技术上找到任何相关资源,因此我在环境特定工厂中使用JSON文件与文件系统进行交互,以及用于保存预加载内容的共享项目我已经从现有的MDF中生成了 - 这是有效的,但是使用UWP的API(以及我的理解)来维护和开发是很痛苦的。

我当然不可能是唯一有此要求/期望的人;有没有一种标准方法来解决这个问题?

我的大部分数据或多或少地被组织成键/值数组,并且通常在每个分组中具有少于10个元组,大约2000-5000个组,具有简单的关系查找,并且在没办法以性能为导向。较低的极值量化了预加载的数据。 SQLite看起来是基于我所做研究的最佳选择,但我不确定如何优雅地破坏我的存储库,而不是独立地为两个环境实现匹配结构,并且复制我在外部生成的SQLite文件。如果SQLite是一个cromulent解决方案,我如何最好地构建可移植性的实现?

1 个答案:

答案 0 :(得分:2)

您是否已将存储库的界面和实现分开?在一个好的设计中,数据库的类型和实现的细节应该对数据使用者是透明的(包括数据库类型:SQL Server,SQLite和其他)。

如果没有,我建议您像这样分离界面和实现: 一个界面,多个实现

在便携式项目中,定义界面和域模型。

public interface IExampleRepository
{
    IEnumerable<string> Get();

    void Save(string value);
}

Desktop的实现(SQLite或MDF文件)

public class UWPExampleRepository : IExampleRepository
{
    public IEnumerable<string> Get()
    {
        throw new NotImplementedException();
    }

    public void Save(string value)
    {
        throw new NotImplementedException();
    }
}

UWP(SQLite)的实施

public class DesktopExampleRepository : IExampleRepository
{
    public IEnumerable<string> Get()
    {
        throw new NotImplementedException();
    }

    public void Save(string value)
    {
        throw new NotImplementedException();
    }
}

加载不同的实现

class Program
{
    static void Main(string[] args)
    {
        IExampleRepository repository = CreateDefaultRepository();

        var data = repository.Get();
    }

    static IExampleRepository CreateDefaultRepository()
    {
        return new DesktopExampleRepository();
    }
}