Needle Manual :: Chapter 8: Service Libraries

Needle— to the point --> | Needle Version: 1.3.0 Manual Last Updated: 2005-12-24 15:20 UTC

| Previous (7. Logging) | Up | Next (9. Customizing Needle) # 8. Service Libraries ## 8.1. Overview Using Needle as it has been presented so far works fine when you are dealing with a single application, all self-encapsulated. When you start dealing with combining multiple libraries, each potentially written by a different author, into a single registry, things get a little more complicated. Needle provides a way for service authors to share their services. All it requires is that authors centralize their service configuration. ## 8.2. Creating Libraries This centralization is implemented by creating a module for each library you want to have services for. That module should then define a module function called (by default) `register_services`. This function should accept a single parameter—the Needle container that the services will be added to. For example, if I had a library of cryptographic routines and I wanted to make them accessible as Needle services, I would create a module to contain the service definitions. Typically, this module will be defined in a file called “services.rb”, although you can certainly name it whatever you like. Needle-enabled library example [ruby]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
    module Crypto

      def register_services( container )
        container.namespace_define( :crypto ) do |b|
          b.prng do
            require 'crypto/prng'
            PRNG.new
          end

          b.des do
            require 'crypto/des'
            DES.new
          end

          ...
        end
      end
      module_function :register_services

    end
Notice that there are no explicit dependencies on Needle, only on the interfaces Needle publishes. Thus, third-parties can add service configuration modules to their libraries without introducing dependencies on Needle. Once a service library has been created, it can then be accessed from another library or application that wishes to import those services. ## 8.3. Using Libraries Using the libraries is as simple as requiring the file that has the service definitions, and then invoking the `#register_services` module function: Example of using a Needle-enabled library [ruby]
1 2 3 4 5 6 7 8 9 10 11 |
    require 'needle'

    reg = Needle::Registry.new
    reg.define do |b|
      b.foo { Foo.new }

      require 'crypto/services'
      Crypto.register_services( reg )
    end

    prng = reg.crypto.prng
To make this easier, the Container class has a convenience method named `#require`: Example of using Container#require [ruby]
1 2 3 4 5 6 7 8 9 |
    require 'needle'

    reg = Needle::Registry.new
    reg.define do |b|
      b.foo { Foo.new }
      b.require 'crypto/services', "Crypto"
    end

    prng = reg.crypto.prng
The `Container#require` method will require the file, and then look for a `#register_services` method of the named module. It will execute that method, passing the container as an argument. Previous (7. Logging) | Up | Next (9. Customizing Needle)