# 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.