Dependency Injection
CLASS … DEFINITION … .
DATA(lo_cash_provider) = NEW cl_cash_provider( ).
ENDCLASS.
👆🏽 This here is a Dependency.
Design pattern in which, instead of creating the object ourselves in our code, we let some other entity create the object and "inject" into our class.
- ⇒ Dependency injection implements OO Design Principles#Inversion of Control.
The dependency can be injected via:
- constructor
- setter method
- parameter
- backdoor
Constructor Injection
CLASS … DEFINITION … .
PUBLIC SECTION.
METHODS constructor
IMPORTING i_cash_provider TYPE REF TO if_cash_provider OPTIONAL.
PRIVATE SECTION.
DATA m_cash_provider TYPE REF TO if_cash_provider.
…
ENDCLASS.
CLASS … IMPLEMENTATION.
METHOD constructor.
m_cash_provider = COND #( WHEN i_cash_provider IS BOUND
THEN i_cash_provider
ELSE NEW cl_cash_provider( ) ).
ENDMETHOD.
…
ENDCLASS.
Setter Injection
CLASS … DEFINITION … .
PUBLIC SECTION.
METHODS set_cash_provider
IMPORTING i_cash_provider TYPE REF TO if_cash_provider.
PRIVATE SECTION.
DATA m_cash_provider TYPE REF TO if_cash_provider.
…
ENDCLASS.
CLASS … IMPLEMENTATION.
METHOD set_cash_provider.
m_cash_provider = i_cash_provider.
ENDMETHOD.
…
ENDCLASS.
Parameter Injection
CLASS … DEFINITION … .
PUBLIC SECTION.
METHODS get_amount_in_coins
IMPORTING
i_amount TYPE i
i_cash_provider TYPE REF TO if_cash_provider OPTIONAL
RETURNING VALUE(r_value) TYPE i.
PRIVATE SECTION.
DATA m_cash_provider TYPE REF TO if_cash_provider.
…
ENDCLASS.
CLASS … IMPLEMENTATION.
METHOD get_amount_in_coins.
DATA(cash_provider) = CAST if_cash_provider(
COND #( WHEN i_cash_provider IS BOUND
THEN i_cash_provider
ELSE NEW cl_cash_provider( ) ) ).
…
ENDMETHOD.
…
ENDCLASS
Backdoor Injection
Injection done using OOP#Friend Class.
CLASS … DEFINITION … .
PRIVATE SECTION.
DATA m_cash_provider TYPE REF TO if_cash_provider.
…
ENDCLASS.
CLASS ltc_get_amount_in_coins DEFINITION DEFERRED.
CLASS cl_money_machine DEFINITION
LOCAL FRIENDS ltc_get_amount_in_coins.
CLASS ltc_get_amount_in_coins DEFINITION FOR TESTING … .
…
ENDCLASS.
CLASS ltc_get_amount_in_coins IMPLEMENTATION.
METHOD setup.
"given
m_cut = NEW #( ).
m_cut->m_cash_provider = NEW ltd_cash_provider( ).
ENDMETHOD.
ENDCLASS.
Field Injection
When a field in a class is directly injected into upon initialization (by a framework or library).
Not generally recommended though.