using Apq.Cfg.Samples.Models; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Apq.Cfg.Samples.Demos; /// /// 示例 7: 依赖注入集成 /// public static class DependencyInjectionDemo { public static async Task RunAsync(string baseDir) { Console.WriteLine("═══════════════════════════════════════════════════════════════"); Console.WriteLine("示例 7: 依赖注入集成"); Console.WriteLine("═══════════════════════════════════════════════════════════════\n"); var configPath = Path.Combine(baseDir, "di-demo.json"); File.WriteAllText(configPath, """ { "Database": { "Host": "db.example.com", "Port": "5432", "Name": "production" }, "Logging": { "Level": "Information", "EnableConsole": "true" } } """); // 配置服务容器 var services = new ServiceCollection(); // 方式1: 使用 AddApqCfg 注册配置 Console.WriteLine("7.1 注册 Apq.Cfg 到 DI 容器:"); services.AddApqCfg(cfg => cfg .AddJson(configPath, level: 0, writeable: true, isPrimaryWriter: true)); Console.WriteLine(" 已注册 ICfgRoot 和 IConfigurationRoot"); // 方式2: 绑定强类型配置 Console.WriteLine("\n7.2 绑定强类型配置:"); services.ConfigureApqCfg("Database"); services.ConfigureApqCfg("Logging"); Console.WriteLine(" 已绑定 DatabaseOptions 和 LoggingOptions"); // 构建服务提供者 var provider = services.BuildServiceProvider(); // 获取服务 Console.WriteLine("\n7.3 从 DI 容器获取服务:"); var cfgRoot = provider.GetRequiredService(); var msConfig = provider.GetRequiredService(); var dbOptions = provider.GetRequiredService>().Value; var logOptions = provider.GetRequiredService>().Value; Console.WriteLine($" ICfgRoot: Database:Host = {cfgRoot.Get("Database:Host")}"); Console.WriteLine($" IConfigurationRoot: Database:Host = {msConfig["Database:Host"]}"); Console.WriteLine($" DatabaseOptions: Host={dbOptions.Host}, Port={dbOptions.Port}, Name={dbOptions.Name}"); Console.WriteLine($" LoggingOptions: Level={logOptions.Level}, EnableConsole={logOptions.EnableConsole}"); // 清理 if (provider is IDisposable disposable) disposable.Dispose(); File.Delete(configPath); Console.WriteLine("\n[示例 7 完成]\n"); await Task.CompletedTask; } }