Kwork는 다음과 같은 루비의 비즈니스 거래를 구축하기위한 도서관입니다.
Kwork::Result
, Dry::Monads::Result
, Dry::Monads::Maybe
...)과 함께 사용하십시오.ROM
, ActiveRecord
...)에 거래 안전을 제공합니다. 이 라인을 응용 프로그램의 보석에 추가하십시오.
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
어댑터와 함께 작동합니다.
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
종종 비즈니스 거래는 데이터베이스 트랜잭션 내에 포장되어야합니다. 이 유스 케이스를 지원하기 위해 Kwork는 트랜잭션 콜백을 확장하여 자신의 코드로 래핑 할 수 있습니다. 몇 가지 확장 기능이 기본적으로 배송되지만 직접 쉽게 구축 할 수 있습니다.
그것을 사용하려면 Gemfile
에 ROM을 추가해야합니다. 이 확장이 사용되면 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 확장을 사용할 수 있습니다. 원시 KWork 트랜잭션은 데이터베이스 트랜잭션 내에 래핑되며 실패를 반환하는 경우 롤백됩니다.
require "kwork"
require "kwork/extensions/active_record"
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ActiveRecord
]
# ...
end
사용자 정의 확장은 KWork Transaction Callback을 수락하는 #call
에 반응하는 것입니다. 해당 콜백을 실행 한 결과에 응답해야합니다. 콜백은 사용중인 어댑터에 관계없이 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
실행할 수도 있습니다.
이 보석을 로컬 컴퓨터에 설치하려면 bundle exec rake install
실행하십시오. 새 버전을 해제하려면 version.rb
에서 버전 번호를 업데이트 한 다음 bundle exec rake release
실행하면 버전에 대한 GIT 태그를 생성하고 GIT 커밋 및 생성 된 태그를 푸시하고 .gem
파일을 RubyGems로 누릅니다. org.
GitHub (https://github.com/)에서 버그 보고서 및 풀 요청은 환영합니다. 이 프로젝트는 협업을위한 안전하고 환영하는 공간이되기위한 것이며, 기고자들은 행동 강령을 준수 할 것으로 예상됩니다.
보석은 MIT 라이센스의 조건에 따라 오픈 소스로 제공됩니다.
Kwork 프로젝트의 코드베이스, 문제 추적기, 대화방 및 메일 링리스트에서 상호 작용하는 모든 사람은 행동 강령을 따라야합니다.