IOC
Minimal dependency injection container for ruby.
Tested on the following Rubies: MRI 2.2.1, 2.0.0, 1.9.3
Installation
Add this line to your application's Gemfile:
gem 'ioc'
And then execute:
$ bundle
Or install it yourself as:
$ gem install ioc
Usage
Block Registration
This example illustrates how to register a service/component with the container by passing a block to the register method.
require "ioc"
class AccountRepository
def initialize(database, logger)
@database = database
@logger = logger
end
end
class UserRepository
def initialize(database, logger)
@database = database
@logger = logger
end
end
class CreateAccountService
def initialize(account_repository, user_repository, logger)
@account_repository = account_repository
@user_repository = user_repository
@logger = logger
end
def call(req, res)
end
end
container = IOC::Container.new
container.register(:create_account_service) do |c|
CreateAccountService.new(c.account_repository, c.user_repository, c.logger)
end
container.register(:user_repository) do |c|
UserRepository.new(c.database, c.logger)
end
container.register(:account_repository) do |c|
AccountRepository.new(c.database, c.logger)
end
container.register(:logger){|c| Logger.new}
container.register(:database){|c| DB}
container.resolve(:create_account_service).call(req, res)
container.release
Automatic Dependency Resolution
Rather than assigning each service's dependencies manually like in the example above, we can allow the container to build and inject each service's dependencies automatically.
container = IOC::Container.new
container.register(:create_account_service, CreateAccountService)
container.register(:user_repository, UserRepository)
container.register(:account_repository, AccountRepository)
container.register(:logger){|c| Logger.new}
container.register(:database){|c| DB}
container.resolve(:create_account_service).call(req, res)
container.release
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
)
- Commit your changes (
git commit -am 'Add some feature'
)
- Push to the branch (
git push origin my-new-feature
)
- Create new Pull Request