iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0

前言

這篇將介紹 boxenn 與 DAL 層的依賴關係和介面。

簡易 Class Diagram

Source 代表的是外部 gem 的 class,本系列文章使用的案例會是 ActiveRecord 的 Model

https://ithelp.ithome.com.tw/upload/images/20210926/20108265nlLISCG1Zt.png

Repository(倉儲)

Repository 的責任是管理 aggregate 持久性和資料取得,因此在 boxenn 中定義了 4個 public method,分別是

def find_by_identity(hash)
	## main logic
	aggregate
end

def find_by_query(query)
	## main logic
	[aggregates]
end

def save(aggregates)
	## main logic
end

def destroy(aggregates)
	## main logic
end

find_by_identity (以唯一識別搜尋)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265uHZpJk7MJp.png

  • 使用的是 identity 做搜尋,因此回傳為一個 aggregate
  • 如果底層的 source 找到不只一筆 record,可以在 repository 的實作中決定處理方式(raise error 或 取第一個…等)

find_by_query (以query搜尋)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265ma77YYHD1K.png

save (新建和更新)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265u0H142waX2.png

  • 可以做批次的更新
  • 如果需要用 transaction,則需要在外部 call 這個 method 的地方包
ActiveRecord::Base.transaction do
	repository.save(entities)
end
  • 這個 method 包含 create 和 update
    如果傳進來 aggregate 的 identity 存在於 DB 內,則更新該筆 record,反之則用此 identity 建立一筆新的 record

destroy (刪除)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265V4iqO6Y7ZJ.png

  • 可批次刪除
  • 同上,如果需要用 transaction,則需要在外部 call 這個 method 的地方包
  • 利用傳進來 aggregate 的 identity 刪除資料

下一篇開始會針對每個 class 進行解說並有實際的範例 code。


上一篇
[Day10] Boxenn 實作 Aggregate 和 Aggregate Root
下一篇
[Day12] Boxenn 實作 Record Mapper 與 Factory
系列文
在 Ruby on Rails 中導入 Domain-Driven Design 是不是搞錯了什麼?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言