一键导入
dependency-injection
Creates Features for dependency injection. Use when creating features, exposing public entry points, or wiring up dependencies.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Creates Features for dependency injection. Use when creating features, exposing public entry points, or wiring up dependencies.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Swift 6 concurrency patterns. Use when working with async/await, actors, MainActor isolation, or Sendable conformance.
Creates Repositories that abstract data access. Use when creating repositories, transforming DTOs to domain models, or implementing local-first caching. Supports remote-only, local-only, and cached (remote + local) repositories with CachePolicy.
Creates a new feature module with minimal viable structure. Use when bootstrapping a new feature from scratch, scaffolding the Tuist module, Container, Feature entry point, DeepLinkHandler, and initial screen with placeholder Text view. Includes all unit tests, mocks, stubs, and app integration. For adding domain/data layers afterward, use /datasource, /repository, /usecase. For enhancing views, use /view, /viewmodel, /navigator.
Creates Navigator for navigation. Use when setting up navigation, adding navigation to ViewModels, or testing navigation behavior.
Creates ViewModels with state management. Use when creating ViewModels, implementing ViewState pattern, or adding state management for features. Delegates to /usecase for domain use cases and to /feature for Container/Feature wiring.
Testing patterns and conventions. Use when writing unit tests, using Swift Testing framework, or following Given/When/Then structure.
| name | dependency-injection |
| description | Creates Features for dependency injection. Use when creating features, exposing public entry points, or wiring up dependencies. |
Guide for creating dependency injection with Composition Root pattern.
ChallengeApp
│
└── AppContainer (Composition Root)
│
├── httpClient: HTTPClientContract
├── tracker: TrackerContract
├── imageLoader: ImageLoaderContract → SwiftUI Environment
│
└── features: [Feature]
├── CharacterFeature (navigation + deep links)
│ └── CharacterContainer (DI composition)
│ ├── repository
│ ├── makeCharacterListView()
│ └── makeCharacterDetailView()
│
└── HomeFeature (navigation)
└── HomeContainer (DI composition)
└── makeHomeView()
some ViewNavigationCoordinatorApp/
├── Sources/
│ └── {AppName}App.swift
AppKit/
├── Sources/
│ ├── AppContainer.swift
│ ├── Presentation/
│ │ ├── Navigation/
│ │ │ └── AppNavigationRedirect.swift
│ │ └── Views/
│ │ ├── NavigationContainerView.swift
│ │ ├── RootContainerView.swift
│ │ └── ModalContainerView.swift
Features/{Feature}/
├── Sources/
│ ├── {Feature}Feature.swift
│ ├── {Feature}Container.swift
│ ├── Navigation/
│ │ ├── {Feature}IncomingNavigation.swift
│ │ ├── {Feature}OutgoingNavigation.swift
│ │ └── {Feature}DeepLinkHandler.swift
│ └── Presentation/
│ └── {Screen}/
│ ├── Navigator/
│ ├── Tracker/
│ ├── Views/
│ └── ViewModels/
└── Tests/
└── Feature/
└── {Feature}FeatureTests.swift
| Type | Pattern | Reason |
|---|---|---|
| HTTPClient | Required init parameter | Injected by AppContainer |
| Tracker | Required init parameter | Injected by AppContainer |
| ImageLoader | SwiftUI Environment | Injected by RootContainerView from AppContainer |
| Container | Created in Feature init | Owns dependency composition |
| DataSource | Local variable in Container init | Only needed to build repositories |
| Repository | Stored property in Container (let) | Built in init, used by factory methods |
| Navigator | Created inline inside Container factory method | New instance per View |
| Screen Tracker | Created inline inside Container factory method | New instance per View |
| ViewModel | Created inline inside Container factory method | New instance per View |
| View | Container factory method (make{Name}View) | Wraps ViewModel; returned as some View |
| UseCase | Created inline | Stateless |
| Component | Visibility | Reason |
|---|---|---|
| Contract (Protocol) | public | API for consumers, enables DI |
| {Feature}Feature | public | Entry point struct |
| {Feature}Container | internal | Created by Feature within same module |
| Feature.makeMainView() | public | Creates the feature's default entry point |
| Feature.resolve() | public | Returns view for navigation or nil |
| AppContainer.init | public | Only public member, created by ChallengeApp |
| AppContainer methods | internal/private | resolveView, handle, makeRootView are internal; rest private |
Container factory methods (make{Name}View) | internal | Called by Feature; return some View |
| {Feature}IncomingNavigation | public | Used by AppNavigationRedirect |
| {Feature}OutgoingNavigation | public | Used by AppNavigationRedirect |
| {Feature}DeepLinkHandler | internal | Accessed via Feature.deepLinkHandler |
| Navigator / Tracker / Views | internal | Internal to feature |
AppContainer.swift in AppKit/Sources/ as Composition RootAppNavigationRedirect.swift in AppKit/Sources/Presentation/Navigation/RootContainerView.swift in AppKit/Sources/Presentation/Views/{Feature}Container.swift for dependency composition{Feature}Feature.swift as struct implementing FeatureContract protocolhttpClient and tracker in inittrackerinitrepository properties (private let)make{Name}View) receiving navigator: any NavigatorContract, returning some View{Feature}IncomingNavigation.swift{Feature}OutgoingNavigation.swift for cross-feature navigation (if needed){Feature}DeepLinkHandler.swift (only if feature handles deep links)AppContainer.features arrayChallengeApp imports ChallengeAppKit and uses RootContainerView