跳至内容

dix 示例

dix 示例

这一页汇总 examples/dix 里的可运行程序,并说明每个示例主要覆盖的 API 场景。

本地运行

examples/dix 模块执行:

cd examples/dix
go run ./basic
go run ./runtime_scope
go run ./inspect

核心示例

示例关注点目录
basic不可变 app spec、build/start/stop、health check、logx 集成examples/dix/basic
aggregate_params多个 typed dependency 的 provider graph 组合examples/dix/aggregate_params
build_runtime显式 Build()Runtime 的流程examples/dix/build_runtime
build_failurevalidation/build 失败路径examples/dix/build_failure

高级示例

示例关注点目录
advanced_do_bridge显式 do bridge setupexamples/dix/advanced_do_bridge
named_aliasnamed service 与 typed alias 绑定examples/dix/named_alias
runtime_scope请求级 runtime scope 与 scoped providerexamples/dix/runtime_scope
transienttransient provider 语义examples/dix/transient
override结构化 overrideexamples/dix/override
inspectruntime inspection 与诊断examples/dix/inspect

示例:基础应用组装

app := dix.New(
    "basic",
    dix.WithLogger(logger),
    dix.WithModule(
        dix.NewModule("config",
            dix.WithModuleProviders(
                dix.Provider0(func() Config { return Config{Port: 8080} }),
            ),
        ),
    ),
)

if err := app.Validate(); err != nil {
    panic(err)
}

rt, err := app.Build()
if err != nil {
    panic(err)
}
defer func() {
    _, _ = rt.StopWithReport(context.Background())
}()

if err := rt.Start(context.Background()); err != nil {
    panic(err)
}

示例:Runtime Scope

requestScope := advanced.Scope(rt, "request-42", func(injector do.Injector) {
    advanced.ProvideScopedValue(injector, RequestContext{RequestID: "req-42"})
    advanced.ProvideScoped2(injector, func(cfg AppConfig, req RequestContext) ScopedService {
        return ScopedService{Config: cfg, Request: req}
    })
})

svc, err := advanced.ResolveScopedAs[ScopedService](requestScope)
if err != nil {
    panic(err)
}
fmt.Println(svc.Request.RequestID)

示例:细粒度 Inspection

provided := advanced.ListProvidedServices(rt)
deps := advanced.ExplainNamedDependencies(rt, "tenant.default")

fmt.Println("provided services:", len(provided))
fmt.Println("tenant graph known:", deps["tenant.default"] != "")

如果你只需要某一个诊断视图,优先使用这些细粒度 helper。 InspectRuntime(...) 依然方便,但它是更重的聚合路径。