E08160: dependency injection is not allowed

Category: E08xxx Pre-IR checks (flow analysis) · Reported in phase: FULL_RESOLUTION · Classification: COMPONENT_INJECTION_NOT_POSSIBLE · All error codes

What went wrong

This injection ('!') cannot be made. Injection may be written in a component, service, class, trait, function, dynamic class or dynamic function - as a property or inside a method or function body - and in a program linked to an application. It is refused here because of one of:

  • the type is not a component (a class, record, trait, function or built-in type cannot be injected - only an abstract component can)
  • the variable is an incoming parameter or a returning value
  • the injection is inside a record (a record holds data only: its fields take part in its generated equality, hashing and copying)
  • the type is a generic type parameter

Worked examples

Compilable examples demonstrating this error and the correct fix:

  • ek9 -q 957 (Why can I only inject components, not classes, in EK9?)
  • ek9 -q 668 (Which constructs support component injection?)

How to fix it

  1. Inject an abstract component: 'logger as Logger!' where Logger is an abstract component
  2. For a parameter or return value, pass the component in or out as an ordinary value, and inject it where it is first needed
  3. Move an injection out of a record into the class, component or function that uses the record

Common causes

  • Injecting a class, record or built-in type instead of a component
  • Marking a parameter or return value with '!'
  • Adding an injected property to a record

See also

  • E08160: injection not possible (this error)
  • E08150: injection of a non-abstract component
  • E08140: injection in a pure context
  • E08220: program uses injection but has no linked application

Examples

Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.

Fails with E08160: dependency injection is not allowed

#!ek9
defines module error.e08160.bad

  defines function

    report()
      <- rtn as String?
      title as String!
      rtn: title

Fixed: Only an abstract component is injected

#!ek9
defines module error.e08160.good

  defines function

    report()
      <- rtn as String?
      timekeeper as Timekeeper!
      rtn: timekeeper.now()

  defines component

    Timekeeper as abstract
      now() as pure abstract
        <- rtn as String?

Questions and answers

These Q&A entries show E08160 and its fix: