Upgrade guide v0.19.x to v1.0
In v0.19.x and earlier a singleton Commanded application was used to host aggregates and support event handlers, process managers, and other infrastructure processes. For v1.0, support for multiple Commanded apps was added allowing you to define and use more than one Commanded app and to control its lifecycle. Follow the following upgrade advice to migrate your application to Commanded v1.0.
Commanded application
First you must define a Commanded application:
defmodule MyApp.Application do
use Commanded.Application, otp_app: :my_app
router(MyApp.Router)
end
The application needs to be configured. You can do so in application config:
# 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
Supervision
The Commanded application must be included and started somewhere in your app's supervision tree. You can include it within the top level application supervisor:
defmodule MyApp do
use Application
def start(_type, _args) do
children = [
MyApp.Application
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
end
end
Command dispatch
Previously commands were always dispatched via a router module. Now, you dispatch commands using your Commanded application:
:ok = MyApp.Application.dispatch(%DoSomething{..})
The above should be a straightforward find within your source code to replace the router module (e.g. MyApp.Router
) with the new application module (e.g. MyApp.Application
).
Optionally, you can dispatch a command using an existing router by configuring the router with the Commanded application:
defmodule MyApp.Router do
use Commanded.Commands.Router, application: MyApp.Application
end
:ok = MyApp.Router.dispatch(%DoSomething{..})
It is also possible to specify the application during command dispatch:
:ok = MyApp.Router.dispatch(%DoSomething{..}, application: MyApp.Application)
Event handlers and process managers
Each handler, read model projections, and process manager needs to be provided with the additional application
option:
defmodule MyApp.ExampleHandler do
use Commanded.Event.Handler,
application: MyApp.Application,
name: "MyApp.ExampleHandler"
end
Upgrade Commanded supporting libraries
You will need to upgrade to the v1.0 versions of any Commanded related library used by your application, such as the event store adapter and Ecto read model projections.