Dependency injection for python.
Project description
Kink
Dependency injection made for python
Features
- Easy to use interface
- Extensible with custom dependency resolvers
- Automatic dependency injection
- Lightweight
- Support for async with asyncio
Installation
pip install kink
Usage
Adding service to dependency injection container
Dependency container is a dict-like object, adding new service to dependency container is as simple as the following example:
from kink import di
from os import getenv
di["db_name"] = getenv("DB_NAME")
di["db_password"] = getenv("DB_PASSWORD")
Adding service factory to dependency injection container
Kink also supports on-demand service creation. In order to define such a service, lambda function should be used:
from kink import di
from sqlite3 import connect
di["db_connection"] = lambda di: connect(di["db_name"])
In this scenario connection to database will not be established until service is requested.
Requesting services fromm dependency injection container
from kink import di
from sqlite3 import connect
# Setting services
di["db_name"] = "test_db.db"
di["db_connection"] = lambda di: connect(di["db_name"])
# Getting service
connection = di["db_connection"] # will return instance of sqlite3.Connection
assert connection == di["db_connection"] # True
Autowiring dependencies
from kink import di, inject
from sqlite3 import connect, Connection
di["db_name"] = "test_db.db"
di["db_connection"] = lambda di: connect(di["db_name"])
# Inject connection from di, connection is established once function is called.
@inject
def get_database(db_connection: Connection):
...
connection = get_database()
connection_with_passed_connection = get_database(connect("temp.db")) # will use passed connection
Constructor injection
from kink import inject, di
import MySQLdb
# Set dependencies
di["db_host"] = "localhost"
di["db_name"] = "test"
di["db_user"] = "user"
di["db_password"] = "password"
di["db_connection"] = lambda di: MySQLdb.connect(host=di["db_host"], user=di["db_user"], passwd=di["db_password"], db=di["db_name"])
@inject
class AbstractRepository:
def __init__(self, db_connection):
self.connection = db_connection
class UserRepository(AbstractRepository):
...
repository = UserRepository()
repository.connection # mysql db connection is resolved and available to use.
When class is annotated by inject
annotation it will be automatically added to the container for future use (eg autowiring).
Services aliasing
When you registering service with @inject
decorator you can attach your own alias name, please consider the following example:
from kink import inject
from typing import Protocol
class IUserRepository(Protocol):
...
@inject(alias=IUserRepository)
class UserRepository:
...
assert di[IUserRepository] == di[UserRepository] # returns true
For more examples check tests directory
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file kink-0.3.7.tar.gz
.
File metadata
- Download URL: kink-0.3.7.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.10 CPython/3.8.7 Darwin/19.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 244ce5da2f3657653ffde6fcfb8cdfbbf7bacc09c557705af7007bc70045f4cd |
|
MD5 | 90b7c666d0a33a09d6f90bd2bc0f4c41 |
|
BLAKE2b-256 | 29b5c9a10c5f2a3474015762c397e8f6bb2c85e00ccbf436837834977a5b92b4 |
File details
Details for the file kink-0.3.7-py3-none-any.whl
.
File metadata
- Download URL: kink-0.3.7-py3-none-any.whl
- Upload date:
- Size: 6.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.10 CPython/3.8.7 Darwin/19.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37b408079fbd2b4c526553417e59b0e36ea3ae236021e04986389f0cebb688ab |
|
MD5 | b67336bfda923542da58e7b38a4653c2 |
|
BLAKE2b-256 | 757f29506db12776cab44ca5500426f27e5e6c59eaf7cf2892cdba43eff4e62d |