Skip to content

Documentation

Warning

Current implementation is under development, consider to avoid using it in production until 1.0.0

Note

Do not confuse md.di.configuration component with md.di.Configuration class which is part of md.di component

Overview

md.di.configuration component is designed to process container configuration.

Architecture overview

Architecture overview

Installation

pip install md.di.configuration --index-url https://source.md.land/python/

Usage example

Resolve definition arguments

md.di.configuration.ResolveProcessor component designed to resolve parameter_map and definition_map of md.di.Configuration.

For example, typical code within dependency injection container would look like:

#!/usr/bin/env python3
class Greeter:
    def __init__(self, name: str = 'Greeter') -> None:
        self._name = name

    def greet(self, who: str) -> str:
        return f'{self._name} greets {who}'


if __name__ == '__main__':
    import md.di

    # arrange
    container_configuration = md.di.Configuration(
        definition_map={
            'Greeter': md.di.Definition(
                class_=Greeter, 
                arguments={
                  'name': 'Parametrized greeter',
                },
                public=True,
            )
        },
    )
    container = md.di.Container(configuration=container_configuration)

    # act
    greeter = container.get(id_='Greeter') 

    assert isinstance(greeter, Greeter)
    print(greeter.greet('demo example'))

Service may take as static as parameterized argument value. To configure definition with referencing to a parameter, use parameter interpolation syntax with parameter name enclosed into curly parentheses (e.g. {domain.some-parameter-key}), for example:

    container_configuration = md.di.Configuration(
        definition_map={
            'Greeter': md.di.Definition(
                class_=Greeter, 
                arguments={
                  'name': '{greeter.name}',
                },
                public=True,
            ),
        },
        parameter_map={
          'greeter.name': 'Greeter with name that defined in container parameter map and passed into service constructor',
        }
    )

    import md.di.configuration      
    processor = md.di.configuration.ResolveProcessor()
    processor.process(configuration=container_configuration)

    container = md.di.Container(configuration=container_configuration)

Modify container configuration

todo ...

service definition: create, update, delete, collect

Registry service

class Send
import md.di
import md.di.configuration

class UpdateProcessor(md.di.configuration.ProcessorInterface):
    def process(self, configuration: md.di.Configuration) -> None:
        for id_, definition in configuration.definition_map.items():

Validate container configuration

todo ...