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项目的代码库,问题跟踪器,聊天室和邮件列表中进行互动的每个人都将遵循《行为守则》。