Skip to main content

simple di framework like java spring-framework

Project description

Simple-PyDI

Intro

simple python dependency injection framwork

just like java spring-framework.

Install

pip install simple-pydi

Usage

Components

app.py

class Engine:
    pass


class Wheels:
    def __init__(self, wheels_count: int = 4):
        self.wheels_count = wheels_count


class Body:
    pass


class Person:
    def __init__(self, name: str):
        self.name = name


class Car:
    def __init__(self, engine: Engine, wheels: Wheels, body: Body, driver: Person):
        self.engine = engine
        self.wheels = wheels
        self.body = body
        self.driver = driver

Direct Register

main.py

from di import NewContext

from app import Car, Engine, Wheels, Body, Person


ctx = NewContext()

# directly register beans
ctx.register(Car, id='car')
ctx.register(Engine)
ctx.register(Wheels)
ctx.register(Body)
ctx.register(Person, consts={'name': 'Ben'})

car: Car = ctx.instance_by_id('car')

assert car.driver.name == 'Ben'
assert car.wheels.wheels_count == 4

# view beans xml definition
print(ctx.format_beans_xml())

Register by XML File

beans.xml

<?xml version="1.0" ?>
<beans>
	<bean cls="app.Car" id="car" singleton="true">
		<property name="engine" ref="cls:app.Engine"/>
		<property name="wheels" ref="cls:app.Wheels"/>
		<property name="body" ref="cls:app.Body"/>
		<property name="driver" ref="cls:app.Person"/>
	</bean>
	<bean cls="app.Engine" id="app.Engine" singleton="true"/>
	<bean cls="app.Wheels" id="app.Wheels" singleton="true">
		<property name="wheels_count" value="4" value-type="int"/>
	</bean>
	<bean cls="app.Body" id="app.Body" singleton="true"/>
	<bean cls="app.Person" id="app.Person" singleton="true">
		<property name="name" value="Ben" value-type="str"/>
	</bean>
</beans>

main.py

from di import NewContext

from app import Car


ctx = NewContext()

# get beans definition from xml file
ctx.register_file('beans.xml')

car: Car = ctx.instance_by_id('car')

assert car.driver.name == 'Ben'
assert car.wheels.wheels_count == 4

# view beans xml definition
print(ctx.format_beans_xml())

Use Decorator Definition

app.py

from di.decorator import bean


@bean
class Engine:
    pass


@bean
class Wheels:
    def __init__(self, wheels_count: int = 4):
        self.wheels_count = wheels_count


@bean
class Body:
    pass


@bean(consts={'name': 'Ben'})
class Person:
    def __init__(self, name: str):
        self.name = name


@bean(id='car')
class Car:
    def __init__(self, engine: Engine, wheels: Wheels, body: Body, driver: Person):
        self.engine = engine
        self.wheels = wheels
        self.body = body
        self.driver = driver

main.py

from di import NewContext

from app import Car

ctx = NewContext()

# register pre defined group (by decorator) 
ctx.register_group()

car: Car = ctx.instance_by_cls(Car)

assert car.driver.name == 'Ben'
assert car.wheels.wheels_count == 4

# view beans xml definition
print(ctx.format_beans_xml())

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Simple-PyDI-0.9.0.tar.gz (6.5 kB view hashes)

Uploaded Source

Built Distribution

Simple_PyDI-0.9.0-py3-none-any.whl (7.3 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page