Segue o erro que está dando no app.
Segue o erro que está dando no app.
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.
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>();
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!