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

ASP.NET Core Web API依赖注入报错:无法构造邮件服务类

ASP.NET Core 6邮件服务DI注入异常问题解决

问题原因

  1. 未注册EmailConfigurations服务:MailService和EmailSender的构造函数都依赖EmailConfigurations,但你仅在DI容器中注册了服务接口与实现类,未将EmailConfigurations本身注册进去,导致容器无法解析该类型的依赖。
  2. ILogger注入不规范:使用非泛型ILogger会导致DI容器无法正确识别日志类别,应使用泛型版本ILogger<T>。

解决步骤

1. 配置文件添加邮件参数

在appsettings.json中新增邮件配置节点:

"EmailConfigurations": {
  "SmtpHost": "smtp.example.com",
  "SenderName": "发件人名称",
  "SenderEmail": "your-email@example.com",
  "SmtpPort": 587,
  "Username": "your-email@example.com",
  "Password": "邮箱密码或授权码"
}

2. 修改DI扩展方法,注册配置类

更新DIServiceExtension类,添加配置绑定与注册逻辑:

public static class DIServiceExtension
{
    public static void AddDependencyInjection(this IServiceCollection services, IConfiguration configuration)
    {
        // 从配置文件读取并注册EmailConfigurations为单例
        var emailConfig = configuration.GetSection("EmailConfigurations").Get<EmailConfigurations>();
        services.AddSingleton(emailConfig);

        services.AddScoped<IAuthService, AuthService>();
        services.AddScoped<ITokenGeneratorService, TokenGeneratorService>();
        services.AddScoped<ITokenRepository, TokenRepository>();
        services.AddTransient<IMailService, MailService>();
        services.AddScoped<IEmailSender, EmailSender>();
    }
}

3. 修正ILogger注入为泛型版本

修改MailService构造函数:

public class MailService : IMailService
{
    private readonly ILogger<MailService> _logger;
    private readonly EmailConfigurations _emailConfig;

    public MailService(ILogger<MailService> logger, EmailConfigurations emailConfig)
    {
        _logger = logger;
        _emailConfig = emailConfig;
    }
    // SendEmailAsync方法实现...
}

修改EmailSender构造函数:

public class EmailSender : IEmailSender
{
    private readonly EmailConfigurations _emailConfig;
    private readonly ILogger<EmailSender> _logger;

    public EmailSender(EmailConfigurations emailConfig, ILogger<EmailSender> logger)
    {
        _emailConfig = emailConfig;
        _logger = logger;
    }
    // 邮件发送方法实现...
}

4. 更新Program.cs的扩展方法调用

将配置对象传入扩展方法:

builder.Services.AddDependencyInjection(builder.Configuration);
var app = builder.Build();

内容的提问来源于stack exchange,提问作者Ayobamilaye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:21:23