亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用一個接口抽象多個數據源供存儲庫使用

使用一個接口抽象多個數據源供存儲庫使用

Go
慕神8447489 2022-06-27 11:08:17
我正在嘗試應用干凈的架構,除此之外,我有一個數據源層和一個存儲庫層。存儲庫使用一個接口與底層數據源(只有一個 sql db atm)進行交互,但是數據源接口是為 sql 數據庫量身定制的,如下所示:package datasourceimport "database/sql"type Source interface {  Open() error                                        // Open the connection  Close()                                             // Close the connection        Exec(string, ...interface{}) error                  // Execute a prepared query(e.g:insert)  Query(string, ...interface{}) (*sql.Rows, error)    // Retrieve rows with a prepared query}正如我想象的其他數據源將在稍后引入(如 nosql dbs 或外部 API ......),我如何將它們全部分組在一個通用接口下,以便存儲庫不需要知道源數據。謝謝你。PS:我知道有類似的問題,但從存儲庫的角度處理問題,我正在尋找數據源方面的解決方案(例如:通用接口),因為我不希望每個單獨的存儲庫資源。
查看完整描述

1 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

您選擇的抽象級別不支持與數據庫無關的實現。您期待 SQL 查詢,并且您正在返回*sql.Rows.


如果您想獨立于數據庫(包括關系數據庫和 NoSQL 數據庫),則需要使用更高的抽象級別,其中不存在 SQL 或 NoSQL 查詢等術語。


例如,如果您打算查詢、加載和保存用戶,您界面的相關部分可能如下所示:


type User struct {

    ID string

    // other info about users

}


type Source interface {

    GetUser(id string) (*User, error)

    SaveUser(u *User) error

    FindUsersByFirstName(firstName string) ([]*User, error)

}

此接口不限制實現使用 SQL 查詢和相關對象,但它表達了您需要的操作。您應用程序的其他部分應該(必須)僅通過此接口訪問數據層。所有的細節(例如 SQL 查詢)都屬于實現。


此外,在您繼續進行這種抽象之前,請檢查其優勢和所需的額外工作,因為人們通常會為極不可能的場景做計劃。如果您從 SQL 數據庫開始,您可能永遠不會切換到 NoSQL 數據庫。


你不能(不應該)有一個單一的數據源層來支持你想要的抽象級別的所有數據庫。這將需要“開發”一種獨立于數據庫的查詢語言及其解析器,然后您需要將其轉換為特定的數據庫查詢。如果要支持所有數據庫,最簡單的方法是合并存儲庫和數據源層?;蛘叻艞壷С炙袛祿?,因為幾乎 99% 的項目永遠不會切換到根本不同的數據庫。


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 291 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號