Integration of Shirinji in rails
Add this line to your application's Gemfile:
gem 'shirinji-rails'
And then execute:
$ bundle
Add this file in config/dependencies.rb
Shirinji::Map.new do
# declare your dependencies here
end
Dependency resolver can be accessed through
Rails.application.config.shirinji.resolver
I suggest to use a helper to make your life easier.
# lib/my_app.rb
module MyApp
module_function
def bean(name)
::Rails.application.config.shirinji.resolver.resolve(name)
end
end
# moments later, in controllers / job / rake tasks
service = MyApp.bean(:user_sign_up_service)
service.call(user)
Since controllers and jobs (and maybe other rails entities) are not under Shirinji's control, they can not receive dependencies through their constructors.
One solution is to manually create a method for each dependency but it's painful and make the code harder to read.
Rails integration actually provides a simple DSL to express dependencies.
# application_controller.rb
class ApplicationController < ActionController::Base
include ShirinjiRails::ResolverBinding
end
# in any controller
class FooController < ApplicationController
dependency :config
# Alias
dependency foo_create_service: :create_service
def index
config #=> `config` dependency
create_service # => `foo_create_service` dependency
end
end
class FooJob < ActiveJob::Base
include ShirinjiRails::ResolverBinding
dependency :config
def perform
config #=> `config` dependency
end
end
Bug reports and pull requests are welcome on GitHub at https://github.com/fdutey/shirinji-rails.