DependencyInjectionDemo.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Apq.Cfg.Samples.Models;
  2. using Microsoft.Extensions.Configuration;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Options;
  5. namespace Apq.Cfg.Samples.Demos;
  6. /// <summary>
  7. /// 示例 7: 依赖注入集成
  8. /// </summary>
  9. public static class DependencyInjectionDemo
  10. {
  11. public static async Task RunAsync(string baseDir)
  12. {
  13. Console.WriteLine("═══════════════════════════════════════════════════════════════");
  14. Console.WriteLine("示例 7: 依赖注入集成");
  15. Console.WriteLine("═══════════════════════════════════════════════════════════════\n");
  16. var configPath = Path.Combine(baseDir, "di-demo.json");
  17. File.WriteAllText(configPath, """
  18. {
  19. "Database": {
  20. "Host": "db.example.com",
  21. "Port": "5432",
  22. "Name": "production"
  23. },
  24. "Logging": {
  25. "Level": "Information",
  26. "EnableConsole": "true"
  27. }
  28. }
  29. """);
  30. // 配置服务容器
  31. var services = new ServiceCollection();
  32. // 方式1: 使用 AddApqCfg 注册配置
  33. Console.WriteLine("7.1 注册 Apq.Cfg 到 DI 容器:");
  34. services.AddApqCfg(cfg => cfg
  35. .AddJson(configPath, level: 0, writeable: true, isPrimaryWriter: true));
  36. Console.WriteLine(" 已注册 ICfgRoot 和 IConfigurationRoot");
  37. // 方式2: 绑定强类型配置
  38. Console.WriteLine("\n7.2 绑定强类型配置:");
  39. services.ConfigureApqCfg<DatabaseOptions>("Database");
  40. services.ConfigureApqCfg<LoggingOptions>("Logging");
  41. Console.WriteLine(" 已绑定 DatabaseOptions 和 LoggingOptions");
  42. // 构建服务提供者
  43. var provider = services.BuildServiceProvider();
  44. // 获取服务
  45. Console.WriteLine("\n7.3 从 DI 容器获取服务:");
  46. var cfgRoot = provider.GetRequiredService<ICfgRoot>();
  47. var msConfig = provider.GetRequiredService<IConfigurationRoot>();
  48. var dbOptions = provider.GetRequiredService<IOptions<DatabaseOptions>>().Value;
  49. var logOptions = provider.GetRequiredService<IOptions<LoggingOptions>>().Value;
  50. Console.WriteLine($" ICfgRoot: Database:Host = {cfgRoot.Get("Database:Host")}");
  51. Console.WriteLine($" IConfigurationRoot: Database:Host = {msConfig["Database:Host"]}");
  52. Console.WriteLine($" DatabaseOptions: Host={dbOptions.Host}, Port={dbOptions.Port}, Name={dbOptions.Name}");
  53. Console.WriteLine($" LoggingOptions: Level={logOptions.Level}, EnableConsole={logOptions.EnableConsole}");
  54. // 清理
  55. if (provider is IDisposable disposable)
  56. disposable.Dispose();
  57. File.Delete(configPath);
  58. Console.WriteLine("\n[示例 7 完成]\n");
  59. await Task.CompletedTask;
  60. }
  61. }