Define an application that wires three components together.

← Dependency Injection · Ref: Q1113

Create the DI registry and connect it to a program:

  defines application
    MyApp
      register ConsoleLogger() as Logger
      register GreetingService() as Service
  defines program
    Main() with application of MyApp
      service as Service!
      stdout <- Stdout()
      stdout.println(service.greet("World"))

'with application of' connects the program to the registry. All injection points resolve from this application.

See Q1110 for register/inject basics. See Q228 for ordering.

Example

defines module qa.di.applicationregistry

  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 ?

    Formatter as abstract
      format() as abstract
        -> text as String
        <- result as String?
      default operator ?

    UpperFormatter is Formatter
      override format()
        -> text as String
        <- result as String: text.upperCase()
      default operator ?

    Service as abstract
      greet() as abstract
        -> name as String
        <- greeting as String?
      default operator ?

    GreetingService is Service
      logger as Logger!
      formatter as Formatter!

      override greet()
        -> name as String
        <- greeting <- String()
        formatted <- formatter.format(name)
        greeting: logger.log(formatted)

      default operator ?

  defines application

    GreetApp
      register ConsoleLogger() as Logger
      register UpperFormatter() as Formatter
      register GreetingService() as Service

  defines program

    ApplicationRegistryDemo() with application of GreetApp
      stdout <- Stdout()
      service as Service!
      result <- service.greet("World")
      stdout.println(result)

Common mistakes

E08220 — A program that uses DI injection must be linked to its application with 'with application of AppName' (EK9 has no wiring annotations). See ek9 -h E08220 for details.

Incorrect:

ApplicationRegistryDemo()

Correct:

ApplicationRegistryDemo() with application of GreetApp
Other ways to ask this
  • I need an application block that registers Logger, Formatter, and Service
  • In Spring I'd use @Configuration with @Bean methods. Write the EK9 application
  • Given three components with dependencies, define the application wiring
  • Set up a complete application registry with multiple registrations

Coming from another language?

Spring: @SpringBootApplication + @Configuration. Guice: AbstractModule.configure(). .NET: Program.cs with builder.Services. EK9: defines application with register statements.

Keywords: wire, register, registry, configuration, application, DI