Compile-time Dependency Injection With Go Cloud's Wire
9 Oct 2018

Robert van Gent

* Overview

The Go team recently [[https://blog.golang.org/go-cloud][announced]] the open source project [[https://github.com/google/go-cloud][Go Cloud]], with portable Cloud APIs and tools for [[https://cloud.google.com/open-cloud/][open cloud]] development. This post goes into more detail about Wire, a dependency injection tool provided with Go Cloud.

* What problem does Wire solve?

[[https://en.wikipedia.org/wiki/Dependency_injection][Dependency injection]] is a standard technique for producing flexible and loosely coupled code, by explicitly providing components with all of the dependencies they need to work. In Go, this often takes the form of passing dependencies to constructors:

    // NewUserStore returns a UserStore that uses cfg and db as dependencies.
    func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore, error) {...}

This technique works great at small scale, but larger applications can have a complex graph of dependencies, resulting in a big block of initialization code that's order-dependent but otherwise not very interesting. It's often hard to break up this code cleanly, especially because some dependencies are used multiple times. Replacing one implementation of a service with another can be painful because it involves modifying the dependency graph by adding a whole new set of dependencies (and their dependencies...), and removing unused old ones. In practice, making changes to initialization code in applications with large dependency graphs is tedious and slow.

Dependency injection tools like Wire aim to simplify the management of initialization code. You describe your services and their dependencies, either as code or as configuration, then Wire processes the resulting graph to figure out ordering and how to pass each service what it needs. Make changes to an application's dependencies by changing a function signature or adding or removing an initializer, and then let Wire do the tedious work of generating initialization code for the entire dependency graph.

* Why is this part of Go Cloud?

Go Cloud's goal is to make it easier to write portable Cloud applications by providing idiomatic Go APIs for useful Cloud services. For example, [[https://godoc.org/github.com/google/go-cloud/blob][blob.Bucket]] provides a storage API with implementations for Amazon's S3 and Google Cloud Storage (GCS); applications written using `blob.Bucket` can swap implementations without changing their application logic. However, the initialization code is inherently provider-specific, and each provider has a different set of dependencies.

For example, [[https://godoc.org/github.com/google/go-cloud/blob/gcsblob#OpenBucket][constructing a GCS `blob.Bucket`]] requires a `gcp.HTTPClient`, which eventually requires `google.Credentials`, while [[https://godoc.org/github.com/google/go-cloud/blob/s3blob][constructing one for S3]] requires an `aws.Config`, which eventually requires AWS credentials. Thus, updating an application to use a different `blob.Bucket` implementation involves exactly the kind of tedious update to the dependency graph that we described above. The driving use case for Wire is to make it easy to swap implementations of Go Cloud portable APIs, but it's also a general-purpose tool for dependency injection.

* Hasn't this been done already?

There are a number of dependency injection frameworks out there. For Go, [[https://github.com/uber-go/dig][Uber's dig]] and [[https://github.com/facebookgo/inject][Facebook's inject]] both use reflection to do runtime dependency injection. Wire was primarily inspired by Java's [[https://google.github.io/dagger/][Dagger 2]], and uses code generation rather than reflection or [[https://en.wikipedia.org/wiki/Service_locator_pattern][service locators]].

We think this approach has several advantages:

- Runtime dependency injection can be hard to follow and debug when the dependency graph gets complex. Using code generation means that the initialization code that's executed at runtime is regular, idiomatic Go code that's easy to understand and debug. Nothing is obfuscated by an intervening framework doing "magic". In particular, problems like forgetting a dependency become compile-time errors, not run-time errors.
- Unlike [[https://en.wikipedia.org/wiki/Service_locator_pattern][service locators]], there's no need to make up arbitrary names or keys to register services. Wire uses Go types to connect components with their dependencies.
- It's easier to avoid dependency bloat. Wire's generated code will only import the dependencies you need, so your binary won't have unused imports. Runtime dependency injectors can't identify unused dependencies until runtime.
- Wire's dependency graph is knowable statically, which provides opportunities for tooling and visualization.

* How does it work?

Wire has two basic concepts: providers and injectors.

_Providers_ are ordinary Go functions that "provide" values given their dependencies, which are described simply as parameters to the function. Here's some sample code that defines three providers:

    // NewUserStore is the same function we saw above; it is a provider for UserStore,
    // with dependencies on *Config and *mysql.DB.
    func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore, error) {...}

    // NewDefaultConfig is a provider for *Config, with no dependencies.
    func NewDefaultConfig() *Config {...}

    // NewDB is a provider for *mysql.DB based on some connection info.
    func NewDB(info *ConnectionInfo) (*mysql.DB, error) {...}

Providers that are commonly used together can be grouped into `ProviderSets`. For example, it's common to use a default `*Config` when creating a `*UserStore`, so we can group `NewUserStore` and `NewDefaultConfig` in a `ProviderSet`:

    var UserStoreSet = wire.ProviderSet(NewUserStore, NewDefaultConfig)

_Injectors_ are generated functions that call providers in dependency order. You write the injector's signature, including any needed inputs as arguments, and insert a call to `wire.Build` with the list of providers or provider sets that are needed to construct the end result:

    func initUserStore() (*UserStore, error) {
    	// We're going to get an error, because NewDB requires a *ConnectionInfo
    	// and we didn't provide one.
    	wire.Build(UserStoreSet, NewDB)
    	return nil, nil  // These return values are ignored.
    }

Now we run go generate to execute wire:

    $ go generate
    wire.go:2:10: inject initUserStore: no provider found for ConnectionInfo (required by provider of *mysql.DB)
    wire: generate failed

Oops! We didn't include a `ConnectionInfo` or tell Wire how to build one. Wire helpfully tells us the line number and types involved. We can either add a provider for it to `wire.Build`, or add it as an argument:

    func initUserStore(info ConnectionInfo) (*UserStore, error) {
    	wire.Build(UserStoreSet, NewDB)
    	return nil, nil  // These return values are ignored.
    }

Now `go generate` will create a new file with the generated code:

    // File: wire_gen.go
    // Code generated by Wire. DO NOT EDIT.
    //go:generate wire
    //+build !wireinject

    func initUserStore(info ConnectionInfo) (*UserStore, error) {
    	defaultConfig := NewDefaultConfig()
    	db, err := NewDB(info)
    	if err != nil {
    		return nil, err
    	}
    	userStore, err := NewUserStore(defaultConfig, db)
    	if err != nil {
    		return nil, err
    	}
    	return userStore, nil
    }

Any non-injector declarations are copied into the generated file. There is no dependency on Wire at runtime: all of the written code is just normal Go code.

As you can see, the output is very close to what a developer would write themselves. This was a trivial example with just three components, so writing the initializer by hand wouldn't be too painful, but Wire saves a lot of manual toil for components and applications with more complex dependency graphs.

* How can I get involved and learn more?

The [[https://github.com/google/go-cloud/blob/master/wire/README.md][Wire README]] goes into more detail about how to use Wire and its more advanced features. There's also a [[https://github.com/google/go-cloud/tree/master/samples/wire][tutorial]] that walks through using Wire in a simple application.

We appreciate any input you have about your experience with Wire! [[https://github.com/google/go-cloud][Go Cloud's]] development is conducted on GitHub, so you can [[https://github.com/google/go-cloud/issues/new][file an issue]] to tell us what could be better. For updates and discussion about the project, join [[https://groups.google.com/forum/#!forum/go-cloud][the project’s mailing list]].

Thank you for taking the time to learn about Go Cloud's Wire. We’re excited to work with you to make Go the language of choice for developers building portable cloud applications.
