Application

Commanded allows you to define, supervise, and start your own application module. To use Commanded you must create at least one application. You can create multiple Commanded applications which will run independently, each using its own separately configured event store.

The application expects at least an :otp_app option to be specified. It should point to an OTP application containing the application's configuration.

For example, the application:

defmodule MyApp.Application do
  use Commanded.Application, otp_app: :my_app

  router MyApp.Router
end

Could be configured with:

# config/config.exs
config :my_app, MyApp.Application,
  event_store: [
    adapter: Commanded.EventStore.Adapters.EventStore,
    event_store: MyApp.EventStore
  ],
  pubsub: :local,
  registry: :local

Alternatively, you can include the event store, pubsub, and registry config when defining the application:

defmodule MyApp.Application do
  use Commanded.Application,
    otp_app: :my_app,
    event_store: [
      adapter: Commanded.EventStore.Adapters.EventStore,
      event_store: MyApp.EventStore
    ],
    pubsub: :local,
    registry: :local

  router(MyApp.Router)
end

Finally, you can provide an optional init/1 function to provide runtime configuration.

defmodule MyApp.Application do
  use Commanded.Application, otp_app: :my_app

  def init(config) do
    {:ok, config}
  end
end

Routing commands

A Commanded application is also a composite router. This provides the router macro allowing you to include one or more router modules for command dispatch.

defmodule MyApp.Application do
  use Commanded.Application, otp_app: :my_app

  router(MyApp.Billing.Router)
  router(MyApp.Customers.Router)
  router(MyApp.Notifications.Router)
end

Once you have defined a router you can dispatch a command using the application module:

:ok = MyApp.Application.dispatch(%RegisterCustomer{id: UUID.uuid4(), name: "Ben"})