如何在开放泛型类型中结合依赖注入使用Microsoft日志(ILogger)
在泛型类
AddTextCalculator1中使用开放泛型ILogger的正确实现 看你的代码片段,应该是想在泛型类里注入对应类型的ILogger,但目前存在服务注册重复、ILogger配置不完整的问题。我来帮你整理出可行的方案:
1. 定义带ILogger依赖的泛型类
首先确保你的AddTextCalculator1是泛型类,并通过构造函数注入匹配的ILogger:
// 假设你的泛型类定义如下 public class AddTextCalculator1<T> { private readonly ILogger<AddTextCalculator1<T>> _logger; // 注入开放泛型的ILogger<T>,这里的T是当前泛型类的具体类型 public AddTextCalculator1(ILogger<AddTextCalculator1<T>> logger) { _logger = logger; } public void Execute(string input) { _logger.LogInformation("执行计算,输入内容: {Input}", input); // 你的业务逻辑代码 } }
2. 正确注册所有服务
你之前重复创建了ServiceCollection,这会导致日志服务和内部服务不在同一个容器里,无法正常注入。请统一使用一个服务集合来配置:
// 创建单个ServiceCollection实例,统一管理所有服务 var services = new ServiceCollection(); // 添加日志服务:这一步会自动注册ILoggerFactory和开放泛型的ILogger<T> services.AddLogging(builder => { // 可选:配置控制台日志输出,方便调试 builder.AddConsole(); }); // 注册你的内部服务 services.AddInternalServices(); // 注册泛型计算器服务(根据你的需求选择生命周期:Transient/Scoped/Singleton) services.AddTransient(typeof(AddTextCalculator1<>)); // 构建服务提供者 var serviceProvider = services.BuildServiceProvider();
3. 获取服务并使用
现在可以从容器中获取具体类型的AddTextCalculator1实例,对应的ILogger会自动被注入:
// 获取针对string类型的计算器实例 var stringCalculator = serviceProvider.GetRequiredService<AddTextCalculator1<string>>(); stringCalculator.Execute("测试字符串计算"); // 如果需要其他类型的实例,比如int var intCalculator = serviceProvider.GetRequiredService<AddTextCalculator1<int>>(); intCalculator.Execute("整数类型计算");
关键注意点
- 调用
services.AddLogging()后,DI容器已经自动注册了开放泛型的ILogger<T>,不需要手动注册ILogger相关的服务,只需要在类的构造函数中声明依赖即可。 - 注册泛型服务时,必须用
typeof(AddTextCalculator1<>)(带空尖括号)表示开放泛型类型,这样容器才能为每个具体类型生成对应的实例并注入匹配的ILogger。 - 绝对不要重复创建
ServiceCollection,所有服务都要注册到同一个集合中,否则之前的配置(比如日志服务)会失效。
内容的提问来源于stack exchange,提问作者Ruan
相关产品推荐
相关产品推荐

