Skip to content

md.di.configuration

[!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 ...