【问题标题】:C# Net Core System.InvalidOperationException: Unable to resolve service for type [duplicate]C# Net Core System.InvalidOperationException:无法解析类型的服务 [重复]
【发布时间】:2021-10-13 03:14:56
【问题描述】:

我遇到以下错误,我无法开始这门课,请您帮我解决。

错误:

System.InvalidOperationException:尝试激活“IcarusOnlineAPI.Controllers.Auth.AuthController”时无法解析“IcarusOnlineAPI.Services.Email.SendEmail”类型的服务。 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型类型,类型 requiredBy,布尔 isDefaultParameterRequired) 在 lambda_method10(闭包,IServiceProvider,对象 []) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.c__DisplayClass4_0.b__0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.c__DisplayClass5_0.g__CreateController|0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- 上一个位置的堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker 调用程序,任务 lastTask,下一个状态,作用域范围,对象状态,布尔 isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序,任务任务,IDisposable 范围) 在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点端点,任务 requestTask,ILogger 记录器) 在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext 上下文) 在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext,ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)

    -Constructor Class--
    private readonly ICARUS_Login_DatabaseContext _loginContext;
    private readonly ICARUS_User_DatabaseContext _userContext;
    private readonly ICARUS_Char_DatabaseContext _charContext;
    private readonly WEBContext _webcontext;
    private readonly ILogger<AuthController> _logger;
    private readonly SendEmail _sendEmail;

    public AuthController(ILogger<AuthController> logger, 
        ICARUS_Login_DatabaseContext loginContext,
        ICARUS_User_DatabaseContext userContext, 
        ICARUS_Char_DatabaseContext charContext, 
        WEBContext webcontext,
        SendEmail sendEmail
        )
    {
        _loginContext = loginContext;
        _userContext = userContext;
        _charContext = charContext;
        _webcontext = webcontext;
        _logger = logger;
        _sendEmail = sendEmail;
    }

-- Send Email Class-


   using IcarusOnlineAPI.MailSender;
   using Microsoft.AspNetCore.Hosting;
   using Microsoft.Extensions.Configuration;
   using System.IO;
   using System.Threading.Tasks;

namespace IcarusOnlineAPI.Services.Email
{
    public class SendEmail
    {
        private readonly IWebHostEnvironment _env;
        private readonly AadGraphApiDelegatedClient _aadGraphApiDelegatedClient;
        private readonly IConfiguration _configuration;

        public SendEmail(IWebHostEnvironment env,
            AadGraphApiDelegatedClient aadGraphApiDelegatedClient,
            IConfiguration configuration)
        {
            _env = env;
            _aadGraphApiDelegatedClient = aadGraphApiDelegatedClient;
            _configuration = configuration;
        }

        public async Task SendRecoverAccountEmail(string Login, string Email, string Token)
        {
            await Task.Delay(10000);

            var emailTemplate = File.ReadAllText
                (Path.Combine(_env.WebRootPath, "EmailTemplates/RecoverAccount.html"));

            var emailContent = emailTemplate
                .Replace("{Login}", Login)
                .Replace("{Link}", _configuration["Url"] + "/RecoverAccount/" + Token);

            var emailMessage = new EmailBuilder()
                .CreateHtmlEmail(Email, "Recuperar Conta", emailContent);

            await _aadGraphApiDelegatedClient.SendEmailAsync(emailMessage);
        }
    }
}

【问题讨论】:

  • 您需要为 SendMail 类注册依赖

标签: c# .net-core


【解决方案1】:

错误是不言自明的。你有public AuthController(SendEmail sendEmail) 并且依赖注入不知道如何实例化sendEmail。在 Controller 的 DI 中传递具体(类)变量不是一个好习惯。你想做这样的事情:

public interface ISendEmail { ... }
public class SendEmail : ISendEmail { ... }

startup.cs 有类似的东西

services.AddScoped<ISendEmail, SendEmail>();

然后在控制器中你会有

private ISendEmail _sendEmail;
public AuthController(ISendEmail sendEmail) {
   _sendEmail = sendEmail;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多