Skip to content

droidlabs/ioc_rb

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IocRb Build Status Code Climate

IocRb is an Inversion of Control container for Ruby. It takes advantage of the dynamic nature of Ruby to provide a rich and flexible approach to injecting dependencies. It's inspired by SpringIoc and tries to give you the same features.

Usage

Lets say you have a Logger which has the Appender dependency

class Logger
  attr_accessor :appender

  def info(message)
    # do some work with appender
  end
end

class Appender
end

To use Logger you need to inject the instance of Appender class, for example using setter injection:

logger = Logger.new
logger.appender = Appender.new
logger.info('some message')

IocRb eliminates the manual injection step and injects dependencies by itself. To use it you need to instantiate IocRb::Container and pass dependency definitions(we call them beans) to it:

container = IocRb::Container.new do |c|
  c.bean(:appender, class: Appender)
  c.bean(:logger, class: Logger) do
    attr :appender, ref: :appender
  end
end

Now you can get the Logger instance from container with already set dependencies and use it:

logger = container[:logger]
logger.info('some message')

To simplify injection IocRb allows you specify dependencies inside of your class:

class Logger
  inject :appender

  def info(message)
    # do some work with appender
  end
end

class Appender
end

With inject keyword you won't need to specify class dependencies in bean definition:

container = IocRb::Container.new do |c|
  c.bean(:appender, class: Appender)
  c.bean(:logger, class: Logger)
end

Installation

Add this line to your application's Gemfile:

gem 'ioc_rb'

And then execute:

$ bundle

Or install it yourself as:

$ gem install ioc_rb

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

TODO

  1. Constructor based injection
  2. Scope registration, refactor BeanFactory. IocRb:Container.register_scope(SomeScope)
  3. Write documentation with more examples

About

Inversion of Control Container for Ruby

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Ruby 100.0%