Skip to main content
Version: Next

Overview of app_di.go

Synopsis

The Cosmos SDK allows much easier wiring of an app.go thanks to App Wiring and depinject. Learn more about the rationale of App Wiring in ADR-057.

This section is intended to provide an overview of the SimApp app_di.go file with App Wiring.

app_config.go

The app_config.go file is the single place to configure all modules parameters.

  1. Create the AppConfig variable:

    simapp/app_config.go
    loading...
  2. Configure the runtime module:

    simapp/app_config.go
    loading...
  3. Configure the modules defined in the PreBlocker, BeginBlocker and EndBlocker and the tx module:

    simapp/app_config.go
    loading...
    simapp/app_config.go
    loading...

Complete app_config.go

simapp/app_config.go
loading...

Alternative formats

tip

The example above shows how to create an AppConfig using Go. However, it is also possible to create an AppConfig using YAML, or JSON.
The configuration can then be embed with go:embed and read with appconfig.LoadYAML, or appconfig.LoadJSON, in app_di.go.

//go:embed app_config.yaml
var (
appConfigYaml []byte
appConfig = appconfig.LoadYAML(appConfigYaml)
)
modules:
- name: runtime
config:
"@type": cosmos.app.runtime.v1alpha1.Module
app_name: SimApp
begin_blockers: [staking, auth, bank]
end_blockers: [bank, auth, staking]
init_genesis: [bank, auth, staking]
- name: auth
config:
"@type": cosmos.auth.module.v1.Module
bech32_prefix: cosmos
- name: bank
config:
"@type": cosmos.bank.module.v1.Module
- name: staking
config:
"@type": cosmos.staking.module.v1.Module
- name: tx
config:
"@type": cosmos.tx.config.v1.Config

A more complete example of app.yaml can be found here.

app_di.go

app_di.go is the place where SimApp is constructed. depinject.Inject facilitates that by automatically wiring the app modules and keepers, provided an application configuration AppConfig is provided. SimApp is constructed, when calling the injected *runtime.AppBuilder, with appBuilder.Build(...).
In short depinject and the runtime package abstract the wiring of the app, and the AppBuilder is the place where the app is constructed. runtime takes care of registering the codecs, KV store, subspaces and instantiating baseapp.

simapp/app_v2.go
loading...
danger

When using depinject.Inject, the injected types must be pointers.

Advanced Configuration

In advanced cases, it is possible to inject extra (module) configuration in a way that is not (yet) supported by AppConfig.
In this case, use depinject.Configs for combining the extra configuration and AppConfig, and depinject.Supply to providing that extra configuration. More information on how work depinject.Configs and depinject.Supply can be found in the depinject documentation.

simapp/app_v2.go
loading...

Registering non app wiring modules

It is possible to combine app wiring / depinject enabled modules with non app wiring modules. To do so, use the app.RegisterModules method to register the modules on your app, as well as app.RegisterStores for registering the extra stores needed.

// ....
app.App = appBuilder.Build(db, traceStore, baseAppOptions...)

// register module manually
app.RegisterStores(storetypes.NewKVStoreKey(example.ModuleName))
app.ExampleKeeper = examplekeeper.NewKeeper(app.appCodec, app.AccountKeeper.AddressCodec(), runtime.NewKVStoreService(app.GetKey(example.ModuleName)), authtypes.NewModuleAddress(govtypes.ModuleName).String())
exampleAppModule := examplemodule.NewAppModule(app.ExampleKeeper)
if err := app.RegisterModules(&exampleAppModule); err != nil {
panic(err)
}

// ....
danger

When using AutoCLI and combining app wiring and non app wiring modules. The AutoCLI options should be manually constructed instead of injected. Otherwise it will miss the non depinject modules and not register their CLI.

Complete app_di.go

tip

Note that in the complete SimApp app_di.go file, testing utilities are also defined, but they could as well be defined in a separate file.

simapp/app_v2.go
loading...