annotation Athena::DependencyInjection::Inject

Overview

Specifies which constructor should be used for injection.

@[ADI::Register(_value: 2, public: true)]
class SomeService
  @active : Bool = false

  def initialize(value : String, @active : Bool)
    @value = value.to_i
  end

  @[ADI::Inject]
  def initialize(@value : Int32); end
end

ADI.container.some_service # => #<SomeService:0x7f51a77b1eb0 @active=false, @value=2>
SomeService.new "1", true  # => #<SomeService:0x7f51a77b1e90 @active=true, @value=1>

Without the ADI::Inject annotation, the first initializer would be used, which would fail since we are not providing a value for the active argument. ADI::Inject allows telling the service container that it should use the second constructor when registering this service. This allows a constructor overload specific to DI to be used while still allowing the type to be used outside of DI via other constructors.

Using the ADI::Inject annotation on a class method also acts a shortcut for defining a service [factory][Athena::DependencyInjection::Register--factories].

Defined in:

annotations.cr