On this page
Constructor dependency injection๏
Beginner โ Intermediate. Annotations, explicit targets, collections.
Annotate a constructor parameter. Melder builds the graph.
What an annotation selects depends on what it is. A class selects the spells of that type โ a class
bound bare, or an existing object of that class โ and nothing else: a category that happens to share the
class's name does not turn its members into providers. A Protocol selects the spells bound under it as
their contract. A TYPE_CHECKING-only import, which leaves a string at runtime, resolves by name to a
type or a contract, never to a string category. list[...] gathers the group the annotation's kind names:
every spell of the class, every implementer of the Protocol, or โ for a string โ every member of the
category or type of that name.
class ReportService:
def __init__(self, database: Database) -> None: # โ injected
self.database = database
book.bind(spell=Database, existence="unique")
book.bind(spell=ReportService, existence="unique")
conduit = book.conjure()
report = conduit.meld("ReportService")
Runnable examples๏
Constructor di by annotation โ Intermediate 15
Typed melding โ Beginner 16