KWORK是用於Ruby旨在建設業務交易的圖書館:
Kwork::Result , Dry::Monads::Result , Dry::Monads::Maybe ...)。ROM , ActiveRecord ...)提供交易安全性。 將此行添加到您的應用程序的gemfile:
gem 'kwork' , github : 'waiting-for-dev/kwork'然後執行:
$ bundle install
使用dry-auto_inject和dry-monads 。
require "kwork"
class CheckOutOrder
include Kwork [ adapter : :result ]
include Deps [ :update_line_items , :update_order , :calculate_best_prices , :enqueue_order_completed_email ]
def call ( order_id , attrs )
attrs = step validate ( attrs )
line_items = step update_line_items . ( order_id , attrs [ :line_items ] )
order = step update_order . ( order_id , attrs . except ( :line_items ) )
step calculate_best_prices . ( order : , line_items : )
step enqueue_order_completed_email . ( order )
success ( order )
end
private
def validate ( attrs )
# ...
end
end
include Dry :: Monads [ :result ]
case CheckoutOrder . new
in Success [ message ]
puts message
in Failure [ error ]
puts error
end您可以利用可交易的方法來優雅地使用鐵路模式進行數據轉換或整個交易工作流程。目前,它僅適用於Dry::Monads::Result Adapter:
class CreateUser
include Kwork [ adapter : :result ]
include Deps [ "user_repo" , "validate_user" ]
include Dry :: Monads [ :result ]
DEFAULT_USER_ATTRS = {
country : :us ,
currency : :usd
}
def call ( user_attrs )
user = pipe user_attrs ,
merge ( DEFAULT_USER_ATTRS ) ,
method ( :validate_user )
step create_user ( user )
end
private
def create_user ( user )
Success ( user_repo . create ( user ) )
end
end通常,需要將業務交易包裹在數據庫交易中。為了支持此用例,KWORW使您能夠擴展交易回調,以便您可以用自己的代碼包裝它。默認情況下,幾個擴展程序是運輸的,但是您可以輕鬆地構建自己的。
您需要將ROM添加到Gemfile中才能使用它。當使用此擴展名時,KWORK交易將包裹在數據庫事務中,該數據庫事務將在返回故障的情況下回滾。
require "kwork"
require "kwork/extensions/rom"
rom = # ROM container
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ROM [ rom , :default ] # :default is the name of the gateway
]
# ...
end 在Rails應用程序中,您可以使用ActivereCord擴展名。 RAW KWORK事務將包裹在數據庫事務中,並在返回故障的情況下將其回滾。
require "kwork"
require "kwork/extensions/active_record"
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ActiveRecord
]
# ...
end 自定義擴展只是任何響應#call接受KWork交易回調的東西。您只需要確保響應執行該回調的結果。考慮到回調將返回Kwork::Result的實例,而不管使用中的適配器如何。這可以確保使用任何結果類型完全可操作性。
require "kwork"
MyExtension = lambda do | callback |
callback . ( ) . tap do | result |
do_something if result . success?
end
end
class AddUser
include Kwork [
extension : MyExtension
]
# ...
end 檢查回購後,運行bin/setup以安裝依賴關係。然後,運行rake spec以運行測試。您還可以運行bin/console以獲得交互提示,該提示可以讓您進行實驗。
要將此GEM安裝到本地計算機上,請運行bundle exec rake install 。要發布新版本,請在version.rb中更新版本號,然後運行bundle exec rake release ,該版本將為版本創建一個Git標籤,推送Git Consits和創建標籤,然後將.gem文件推到RubyGems。 org。
歡迎在https://github.com/ [username]/kwork上的GitHub上的錯誤報告和拉動請求。該項目旨在是一個安全,熱情的協作空間,預計貢獻者將遵守行為準則。
根據MIT許可證的條款,該寶石可作為開源。
在KWork項目的代碼庫,問題跟踪器,聊天室和郵件列表中進行互動的每個人都將遵循《行為守則》。