2014-02-10 44 views
-1

我真的很難決定如何建立我的SQL層。我正在構建一個web服務,它將與sql和No-SQL服務器進行通信。所以我想出了一些想法,以便我們可以實施測試等等。L2SQL異步與否?

現在我有一堆文件和一個結構,我解釋(對不起,我使用過我的名字, t使用...請糾正我在這種情況下): -IDatabaseStore.cs -SqlDatabaseStore.cs -NoSQLDatabaseStore.cs - 和我所有的特定商店(如userStore.cs實現sql存儲例如)。

我想做以下事情: SQL-和NoSQLDatabaseStore都將實現IDatabaseStore。這兩個類將是抽象的,以提供像Repository模式那樣的基本功能。所有特定的商店都將實現這兩​​個抽象類中的一個,以不重建所有內容。

現在的問題:我使用的無SQL庫是MyCouch,完全異步,但對於SQL,我使用不是異步的L2SQL。

現在我的問題:你認爲如何設置它?

  1. 與示例1一樣,強制使用異步方法,並且如果它們不是異步(如L2SQL)。

  2. 使接口像例2那樣,所有動態的都將通用類型作爲任務傳遞,以防它需要是異步的。這種方式我不強制我的接口和抽象類是異步的(但是void方法在這種情況下不是異步的?)。

  3. 我錯過了一種使L2SQL異步的方法嗎?注意:我已經看過很多帖子,但它們似乎不適合這個模型。

  4. 其他建議?

在性能情況下,我真的很想壽有一個異步L2SQL,因爲我需要管理大量的連接,這可能真的benifit web服務。但是例如像下面這樣的解決方案:https://stackoverflow.com/a/252426/1364241不等於,不是?

實施例1:

public interface IDatabaseStore { 
    Task<T> GetByID(string id); 
    Task<List<T>> GetAll(); 
    Task Delete(T model); 
    Task Update(T model); 
    Task Insert(T model); 
} 

實施例2:

public interface IDatabaseStore { 
    T GetByID(string id); 
    List<T> GetAll(); 
    void Delete(T model); 
    void Update(T model); 
    void Insert(T model); 
} 
+0

你認爲實體框架是否替代L2SQL? –

+0

@StephenCleary是的,我一直在看它,但是我從大約10個SO文章中瞭解到的是,L2SQL比EF快。或者在這種情況下,由於異步方法,EF的優勢更大? – spons

+0

@StephenCleary在這種情況下,它將是完美的解決方案。 – spons

回答

2

實體框架的最新版本支持異步操作,所以我建議您在EF6和MyCouch實現中使用異步接口。

0

這在深度文章中討論:Should I expose asynchronous wrappers for synchronous methods?

總之,沒有,你不應該。最好的解決方案是簡單地分離出什麼是異步的同步。每個實現都有獨立的接口,每個實現只實現與它們是實際同步還是異步對應的接口。不要試圖將兩者統一成一個界面。

你有兩種完全不同的數據庫操作類型。他們是如此不同,他們應該消耗不同。他們可以互換是不正確的,所以你不應該試圖強制這種互換性。

+0

感謝您的文章,我會看看它。我同意它是2種完全不同類型的數據庫。但我不同意他們不可互換。如果我要求NoSQL讓我用戶X我需要一個getByID方法。但是,當我問它到SQL我想要的exacte相同的方法。只有一個不同的執行。在這種情況下,我認爲這個接口服務器非常好。除了使用L2SQL和MyCouch,他們可以實現這種簡單方法的默認實現,這可以防止編碼多次。 – spons

+1

@spons如果你已經知道你的問題的答案,並且不願意接受其他可能的答案,那麼爲什麼首先要問這個問題? – Servy

+0

我確實願意尋找其他可能的解決方案。看看主帖的評論。雖然,我只是不同意你說的話。如果我說了一些不是真的,請解釋一下。我很樂意接受你的接受者,如果這是正確的,我只會說我不同意,並且是因爲什麼原因。我並沒有試圖冒犯你...... – spons