Register a Logger service and inject it into a program.

← Dependency Injection · Ref: Q1110

Register concrete as abstract, inject with ! suffix:

  register ConsoleLogger() as Logger
  ...
  service as Logger!

The ! suffix marks an injection point. The compiler validates a matching registration exists.

See Q227 for compile-time DI validation. See Q228 for registration ordering.

Example

defines module qa.di.registerinjectbasic

  defines component

    Logger as abstract
      log() as abstract
        -> message as String
        <- output as String?

      default operator ?

    ConsoleLogger is Logger
      override log()
        -> message as String
        <- output as String: `LOG: ${message}`

      default operator ?

  defines application

    BasicApp
      register ConsoleLogger() as Logger

  defines program

    RegisterInjectBasicDemo() with application of BasicApp
      stdout <- Stdout()

      //Injected via '!' suffix — compiler verified
      logger as Logger!
      result <- logger.log("Application started")
      stdout.println(result)

Common mistakes

E08210 — Every injection point (!) must have a matching registration in the application. The compiler rejects missing registrations.

Incorrect:

      //missing registration

Correct:

      register ConsoleLogger() as Logger
Other ways to ask this
  • I need to wire a component into a program using EK9's DI system
  • In Spring I'd use @Autowired to inject a service. Write the EK9 equivalent
  • Given an abstract Logger and concrete ConsoleLogger, register and inject it
  • Set up an application that provides a Logger to a program via injection

Coming from another language?

Spring: @Autowired Logger logger. Guice: @Inject Logger logger. .NET: services.AddSingleton<ILogger, ConsoleLogger>(). EK9: register + '!' suffix injection.

Keywords: !, register, application, DI, wire, inject, component