# dry-container ![Join the chat at https://gitter.im/dryrb/chat](https://badges.gitter.im/Join%20Chat.svg)
![Gem Version](https://badge.fury.io/rb/dry-container.svg)
![Build Status](https://travis-ci.org/dryrb/dry-container.svg?branch=master)
![Inline docs](http://inch-ci.org/github/dryrb/dry-container.svg?branch=master&style=flat)
A simple IoC container implemented in Ruby
## Synopsis
```ruby
User = Struct.new(:name, :email)
data_store = ThreadSafe::Cache.new.tap do |ds|
ds[:users] = ThreadSafe::Array.new
end
# Initialize container
container = Dry::Container.new
# Register an item with the container to be resolved later
container.register(:data_store, data_store)
container.register(:user_repository, -> { container.resolve(:data_store)[:users] })
# Resolve an item from the container
container.resolve(:user_repository) << User.new('Jack', 'jack@dry-container.com')
# You can also resolve with []
container[:user_repository] << User.new('Jill', 'jill@dry-container.com')
# => [
# #,
# #
# ]
# If you wish to register an item that responds to call but don't want it to be
# called when resolved, you can use the options hash
container.register(:proc, -> { :result }, call: false)
container.resolve(:proc)
# => #
# You can also register using a block
container.register(:item) do
:result
end
container.resolve(:item)
# => :result
container.register(:block, call: false) do
:result
end
container.resolve(:block)
# => #
```
You can also get container behaviour at both the class and instance level via the mixin:
```ruby
class Container
extend Dry::Container::Mixin
end
Container.register(:item, :my_item)
Container.resolve(:item)
# => :my_item
class ContainerObject
include Dry::Container::Mixin
end
container = ContainerObject.new
container.register(:item, :my_item)
container.resolve(:item)
# => :my_item
```
## License
See `LICENSE` file.