2015-09-27 82 views
0

我試圖找到一個優雅的解決方案來彌合現有的Windows桌面應用程序和Windows 10通用應用程序之間的存儲庫差距。我的現有應用程序使用本地連接的MDF文件和Entity Framework 6,但是我希望轉向與桌面和通用環境兼容的單個存儲庫。UWP和桌面的便攜式存儲庫

我一直無法找到任何能夠提供此技術的相關資源,因此我在環境特定工廠中使用JSON文件與文件系統交互,並使用共享項目來保存預加載我已經從現有的中密度纖維板生成的內容 - 正在工作,但是使用UWP的API(以及我的理解)維護和開發是很痛苦的。

我當然不可能是唯一有此要求/期望的人;有沒有解決這個問題的標準方法?

我的大部分數據或多或少被組織成鍵/值數組,每個分組中通常具有少於10個元組,大約2000-5000個組,具有簡單的關係查詢,並且絕不以績效爲導向。較低的極限量化預加載的數據。基於我所做的研究,SQLite看起來是最好的選擇,但我不確定如何優雅地打斷我的存儲庫,而無需爲兩個環境獨立實現匹配結構,並複製我在外部生成的SQLite文件。如果SQLite是一個強大的解決方案,我如何最好地構建可移植性的實現?

回答

2

您是否分開了存儲庫的接口和實現?在一個好的設計中,數據庫類型和實現細節應該對數據使用者透明(包括數據庫類型:SQL Server,SQLite等)。

如果沒有,我建議你分離接口和實現這樣的方式: 一個接口,多個實現

在便攜式項目,定義接口和領域模型。桌面

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

    void Save(string value); 
} 

實施(SQLite的或MDF文件)UWP(SQLite的)的

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

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

實施

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(); 
    } 
} 
+0

謝謝您回覆!我已經實施了存儲庫模式,但需要在兩個平臺上實現一致。離散的SQLite庫並不是很有幫助,但是我已經在EF7上取得了很大的進步,併爲beta6中的一些問題提供了一些解決方案。實際上,我可以使用非UWP庫來爲存儲庫創建數據,這很大程度上依賴於無法移植到UWP的數據;而無需使用相同的底層回購技術爲不同目標實施和維護兩個存儲庫。如果我有成功,我會更新! – Gui