You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在开放泛型类型中结合依赖注入使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:36:20