Files
swift-composable-architectu…/Sources/ComposableArchitecture/Documentation.docc/Articles/DependencyManagement.md
Stephen Celis 57e804f1cc Macro bonanza (#2553)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Silence test warnings

* wip

* wip

* wip

* update a bunch of docs

* wip

* wip

* fix

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Kill integration tests for now

* wip

* wip

* wip

* wip

* updating docs for @Reducer macro

* replaced more Reducer protocols with @Reducer

* Fixed some broken docc references

* wip

* Some @Reducer docs

* more docs

* convert some old styles to new style

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* bump

* update tutorials to use body

* update tutorials to use DML on destination state enum

* Add diagnostic

* wip

* updated a few more tests

* wip

* wip

* Add another gotcha

* wip

* wip

* wip

* fixes

* wip

* wip

* wip

* wip

* wip

* fix

* wip

* remove for now

* wip

* wip

* updated some docs

* migration guides

* more migration guide

* fix ci

* fix

* soft deprecate all apis using AnyCasePath

* wip

* Fix

* fix tests

* swift-format 509 compatibility

* wip

* wip

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>

* wip

* wip

* update optional state case study

* remove initializer

* Don't use @State for BasicsView integration demo

* fix tests

* remove reduce diagnostics for now

* diagnose error not warning

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Jesse Tipton <jesse@jessetipton.com>

* wip

* move integration tests to cron

* Revert "move integration tests to cron"

This reverts commit f9bdf2f04b.

* disable flakey tests on CI

* wip

* wip

* Revert "Revert "move integration tests to cron""

This reverts commit 66aafa7327.

* fix

* wip

* fix

---------

Co-authored-by: Brandon Williams <mbrandonw@hey.com>
Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>
Co-authored-by: Brandon Williams <135203+mbrandonw@users.noreply.github.com>
Co-authored-by: Jesse Tipton <jesse@jessetipton.com>
2023-11-13 12:57:35 -08:00

60 lines
2.8 KiB
Markdown

# Dependencies
Learn how to register dependencies with the library so that they can be immediately accessible from
any reducer.
## Overview
Dependencies in an application are the types and functions that need to interact with outside
systems that you do not control. Classic examples of this are API clients that make network requests
to servers, but also seemingly innocuous things such as `UUID` and `Date` initializers, and even
clocks, can be thought of as dependencies.
By controlling the dependencies our features need to do their job we gain the ability to completely
alter the execution context a feature runs in. This means in tests and Xcode previews you can
provide a mock version of an API client that immediately returns some stubbed data rather than
making a live network request to a server.
> Note: The dependency management system in the Composable Architecture is driven off of our
> [Dependencies][swift-dependencies-gh] library. That repository has extensive
> [documentation][swift-deps-docs] and articles, and we highly recommend you familiarize yourself
> with all of that content to best leverage dependencies.
## Overriding dependencies
It is possible to change the dependencies for just one particular reducer inside a larger composed
reducer. This can be handy when running a feature in a more controlled environment where it may not
be appropriate to communicate with the outside world.
For example, suppose you want to teach users how to use your feature through an onboarding
experience. In such an experience it may not be appropriate for the user's actions to cause
data to be written to disk, or user defaults to be written, or any number of things. It would be
better to use mock versions of those dependencies so that the user can interact with your feature
in a fully controlled environment.
To do this you can use the ``Reducer/dependency(_:_:)`` method to override a reducer's
dependency with another value:
```swift
@Reducer
struct Onboarding {
var body: some Reducer<State, Action> {
Reduce { state, action in
// Additional onboarding logic
}
Feature()
.dependency(\.userDefaults, .mock)
.dependency(\.database, .mock)
}
}
```
This will cause the `Feature` reducer to use a mock user defaults and database dependency, as well
as any reducer `Feature` uses under the hood, _and_ any effects produced by `Feature`.
[swift-identified-collections]: https://github.com/pointfreeco/swift-identified-collections
[environment-values-docs]: https://developer.apple.com/documentation/swiftui/environmentvalues
[xctest-dynamic-overlay-gh]: http://github.com/pointfreeco/xctest-dynamic-overlay
[swift-dependencies-gh]: http://github.com/pointfreeco/swift-dependencies
[swift-deps-docs]: https://pointfreeco.github.io/swift-dependencies/main/documentation/dependencies/