2. AttrInject

2.1. Overview

AttrInject is an implementation of dependency injection that uses declared interfaces to determine dependencies. It is based on an implementation by Christian Neukirchen at http://rafb.net/paste/results/sexpfu84.html.

2.2. Usage

AttrInject is very straightforward to use. Just require the AttrInject library in every service implementation and use the new attr_inject macro to specify which other services the class depends on:

  require 'needle/extras/attr-inject'

  class Foo
    attr_inject :bar
    attr_inject :baz, :blah

    def frobnicate
      @bar + @baz / @blah
    end
  end

The attr_inject macro does not create any accessors—it only declares the dependencies that the corresponding service has. Then, when you register the service, you specify one of the inject service models:

  require 'needle'
  require 'needle/extras'
  ...
  reg.require_library 'needle/extras'
  reg.define do |b|
    b.bar { 5 }
    b.baz { 10 }
    b.blah { Math::PI }

    b.foo( :model => :singleton_inject ) { Foo.new }
  end

The singleton_inject service model is just like singleton, but it will also automatically inject all of the declared dependencies into the new service. Thus, invoking #frobnicate on the foo service would compute and return (in this case) 5 + 10 / PI.

This approach has the benefit of reducing the amount of initialization code you have to write. On the other hand, it more tightly couples your implementation code to Needle itself.