Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro no Programa.cs

Segue o erro que está dando no app.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

9 respostas

Erro

System.AggregateException: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType:
UsuariosApi.Services.CadastroService Lifetime: Scoped ImplementationType: UsuariosApi.Services.CadastroService': Unable to resolve
service for type 'UsuariosApi.Services.EmailService' while attempting to activate 'UsuariosApi.Services.CadastroService'.)'

1
InvalidOperationException: Error while validating the service descriptor 'ServiceType: UsuariosApi.Services.CadastroService Lifetime:
Scoped ImplementationType: UsuariosApi.Services.CadastroService': Unable to resolve service for type 'UsuariosApi.Services.EmailService'
while attempting to activate 'UsuariosApi.Services.CadastroService'.

2
InvalidOperationException: Unable to resolve service for type 'UsuariosApi.Services.EmailService' while attempting to activate
'UsuariosApi.Services.CadastroService'.

CadastroService

public Result CadastraUsuario(CreateUsuarioDto createDto)
        {
            Usuario usuario = _mapper.Map<Usuario>(createDto);
            IdentityUser<int> usuarioIdentity = _mapper.Map<IdentityUser<int>>(usuario);
            Task<IdentityResult> resultadoIdentity = _userManager.CreateAsync(usuarioIdentity, createDto.Password);

            if (resultadoIdentity.Result.Succeeded)
            {
                var code = _userManager
                    .GenerateEmailConfirmationTokenAsync(usuarioIdentity)
                    .Result;
                var encodedCode = HttpUtility.UrlEncode(code);
                _emailService.EnviarEmail(new[] { usuarioIdentity.Email },
                    "Link de Ativação", usuarioIdentity.Id, encodedCode);

                return Result.Ok().WithSuccess(code);
            }
            return Result.Fail("Falha ao cadastrar usuário");
        }


        public Result AtivaContaUsuario(AtivaContaRequest request)
        {
            var identityUse = _userManager
                .Users
                .FirstOrDefault(u => u.Id == request.UsuarioId);

            var identityResult = _userManager
                .ConfirmEmailAsync(identityUse, request.CodigoDeAtivacao)
                .Result;

            if (identityResult.Succeeded)
            {
                return Result.Ok();
            }
            return Result.Fail("Falha ao ativar conta de usuário");
        }

CadastroController


        [HttpGet("/ativa")]
        public IActionResult AtivaContaUsuario([FromQuery] AtivaContaRequest request)
        {
            Result resultado = _cadastroServise.AtivaContaUsuario(request);
            if (resultado.IsFailed) return StatusCode(500);
            return Ok(resultado.Successes);
        }

Startup

            services.AddScoped<CadastroService, CadastroService>();
            services.AddScoped<TokenService, TokenService>();
            services.AddScoped<LoginService, LoginService>();
            services.AddScoped<LogoutService, LogoutService>();

AtivaContaRequest

        [Required]
        public int UsuarioId { get; set; }
        [Required]
        public string CodigoDeAtivacao { get; set; }

EmailService

using Microsoft.Extensions.Configuration;

        private IConfiguration _configuration;

        public EmailService(IConfiguration configuration)
        {
            _configuration = configuration;
        }


                public void EnviarEmail(string[] destinatario,
            string assunto, int usuarioId, string code)
        {
            Mensagem mensagem = new Mensagem(destinatario,
                assunto, usuarioId, code);

            var mensagemDeEmail = CriaCorpoDoEmail(mensagem);

            Enviar(mensagemDeEmail);
        }

        private MimeMessage CriaCorpoDoEmail(Mensagem mensagem)
        {
            var mensagemCorpoEmail = new MimeMessage();
            mensagemCorpoEmail.From.Add(new MailboxAddress(
                _configuration.GetValue<string>("EmailSettings:From")));
            mensagemCorpoEmail.To.AddRange(mensagem.Destinatario);
            mensagemCorpoEmail.Subject = mensagem.Assunto;
            mensagemCorpoEmail.Body = new TextPart(MimeKit.Text.TextFormat.Text)
            {
                Text = mensagem.Conteudo
            };

            return mensagemCorpoEmail;
        }


         private void Enviar(MimeMessage sendMensagem)
        {
            using (var client = new SmtpClient())
            {
                try
                {
                    client.Connect(
                        _configuration.GetValue<string>("EmailSettings:SmtpServer"),
                        _configuration.GetValue<int>("EmailSettings:Port"), true);
                    client.AuthenticationMechanisms.Remove("XOUATH2");
                    client.Authenticate(
                        _configuration.GetValue<string>("EmailSettings:From"),
                        _configuration.GetValue<string>("EmailSettings:Password"));
                    client.Send(sendMensagem);
                }
                catch
                {
                    throw;
                }
                finally
                {
                    client.Disconnect(true);
                    client.Dispose();
                }
            }
        }

Mensagem

        public List<MailboxAddress> Destinatario { get; set; }
        public string Assunto { get; set; }
        public string Conteudo { get; set; }

        public Mensagem(IEnumerable<string> destinatario,
            string assunto, int usuarioId, string codigo)
        {
            Destinatario = new List<MailboxAddress>();
            Destinatario.AddRange(
                destinatario.Select(d => new MailboxAddress(d)));

            Assunto = assunto;

            Conteudo = $"http://localhost:6000/ativa?UsuarioId={usuarioId}&CodigoDeAtivacao={codigo}";
        }

appsettings.json

  "EmailSettings": {
    "From": "usingteststudies@gmail.com",
    "SmtpServer": "smtp.gmail.com",
    "Port": "465",
    "Password": "ubgyqendxtkwasfn"
  }

Esse é o resumo das classes.

Para ver o projeto todo segue meu GitHub.

https://github.com/IgorTudisco/API_Rest.NET5

Adicione isso a Startup: services.AddScoped(option => new EmailService(Configuration)); Caso o serviço de e-mail tenha uma interface faça isso :services.AddScoped<IEmailService, EmailService>();

solução!

Fiz a declaração no Startup aí deu bom, tinha me esquecido disso.

            services.AddScoped<EmailService, EmailService>(); // esse aqui.
            services.AddScoped<CadastroService, CadastroService>();
            services.AddScoped<TokenService, TokenService>();
            services.AddScoped<LoginService, LoginService>();
            services.AddScoped<LogoutService, LogoutService>();

@Jackson Souza Maciel

Muito Obrigado.

Quem nunca esqueceu haha

kkkkkkkkkkkkk

Verdade!