README.md in smart_injection-0.0.0 vs README.md in smart_injection-0.1.0

- old
+ new

@@ -1,9 +1,29 @@ # SmartCore::Injection · [![Gem Version](https://badge.fury.io/rb/smart_injection.svg)](https://badge.fury.io/rb/smart_injection) [![Build Status](https://travis-ci.org/smart-rb/smart_injection.svg?branch=master)](https://travis-ci.org/smart-rb/smart_injection) Dependency injection principles and idioms realized in scope of Ruby. +--- + +## Major Features + +- `method-injection` strategy +- `soon:` constructor injection strategy; +- `soon:` property injection strategy; +- realized as a mixin; +- instance-method dependency injection; +- class-method dependency injection; +- multiple IoC-container registration; +- static and dynamic bindings; +- support for memoization with run-time dependency-switchable re-memoization; +- an ability to import dependencies from the list of IoC-containers +- an ability to import from the pre-configured default IoC-container(s); +- an ability to import from any manually passed IoC-container; +- privacy control of injected dependency (public/private/protected); + +--- + ## Installation ```ruby gem 'smart_injection' ``` @@ -14,9 +34,74 @@ gem install smart_injection ``` ```ruby require 'smart_core/injection' +``` + +--- + +## Synopsis + +Create some containers: + +```ruby +AppContainer = SmartCore::Container.define do + namespace(:data_storage) do + register(:main) { Sequel::Model.db } + register(:cache) { Redis.new } + end +end + +ServiceContainer = SmartCore::Container.define do + namespace(:rands) do + register(:alphanum) { -> { SeureRandom.alphanumeric } } + register(:hex) { -> { SecureRandom.hex } } + end +end + +GlobalContainer = SmartCore::Container.define do + namespace(:phone_clients) do + register(:nexmo) { Nexmo.new } + register(:twilio) { Twilio.new } + end +end +``` + +And work with dependency injection: + +```ruby +class MiniService + include SmartCore::Injection + + register_container(AppContainer) + register_container(ServiceContainer) + + # --- or --- + include SmartCore::Injection(AppContainer, ServiceContainer) + + # --- or --- + include SmartCore::Injection + register_container(AppContainer, ServiceContainer) + + # import dependencies to an instance + import({ db: 'data_storage.main' }, bind: :dynamic, access: :private) + import({ rnd: 'rands.alphanum' }, bind: :static, memoize: true) + + # import dependencies to a class + import_static({ cache: 'data_storage.cache', hexer: 'rands.hex' }, bind: :static) + + # import from a non-registered container + import({ phone_client: 'phone_clients.nexmo' }, from: GlobalContainer) + + def call + db # => returns data_storage.main + rnd # => returns rands.alphanum + self.class.cache # => returns data_storage.cache + self.class.hexer # => returns rands.hexer + phone_client # => returns phone_clients.nexmo + end +end ``` --- ## Contributing