Inyección de Dependencias en ASP.NET Core: Un cliente SMTP (I)
En este artículo, vamos a construir una aplicación ASP.NET Core utilizando la inyección de dependencias para un cliente de correo electrónico (SMTP) llamado MailService
. Proporcionaremos ejemplos de código extensos y explicaciones detalladas para cada paso, asegurando que cualquier programador pueda seguir estos pasos y obtener una aplicación funcional en Visual Studio.
Paso 1: Crear el Proyecto ASP.NET Core
- Abre Visual Studio y selecciona Create a new project.
- Elige ASP.NET Core Web Application y haz clic en Next.
- Nombra tu proyecto (por ejemplo,
EmailServiceApp
) y selecciona una ubicación para guardarlo. Haz clic en Create. - En la siguiente ventana, selecciona ASP.NET Core Web App (Model-View-Controller) y asegúrate de que la versión de .NET Core sea 3.0 o superior. Haz clic en Create.
Paso 2: Configurar el Contenedor de Servicios
2.1 Definir la Interfaz y la Implementación del Servicio de Correo
Primero, vamos a definir una interfaz IMailService
que describa el contrato del servicio de correo y luego implementar esta interfaz en una clase MailService
.
Crear la Interfaz IMailService
- En el Explorador de Soluciones, haz clic derecho en el proyecto y selecciona Add > New Folder. Nombra la carpeta
Services
. - Haz clic derecho en la carpeta
Services
y selecciona Add > Class. Nombra la claseIMailService.cs
. - Define la interfaz
IMailService
como se muestra a continuación:
namespace EmailServiceApp.Services
{
public interface IMailService
{
void SendEmail(string to, string subject, string body);
}
}
En este código, IMailService
define un método SendEmail
que toma tres parámetros: to
(destinatario del correo), subject
(asunto del correo) y body
(cuerpo del correo). Esta interfaz actúa como un contrato que cualquier implementación de servicio de correo debe cumplir.
Implementar la Clase MailService
- Haz clic derecho en la carpeta
Services
y selecciona Add > Class. Nombra la claseMailService.cs
. - Implementa la clase
MailService
como se muestra a continuación:
using System;
namespace EmailServiceApp.Services
{
public class MailService : IMailService
{
private readonly string _smtpServer;
private readonly int _smtpPort;
public MailService(string smtpServer, int smtpPort)
{
_smtpServer = smtpServer;
_smtpPort = smtpPort;
}
public void SendEmail(string to, string subject, string body)
{
// Aquí iría la lógica para enviar el correo
Console.WriteLine($"Enviando correo a {to} con asunto {subject} usando {_smtpServer}:{_smtpPort}");
}
}
}
En esta implementación, MailService
acepta parámetros para el servidor SMTP y el puerto en su constructor. Estos valores se almacenan en campos privados y se utilizan en el método SendEmail
para enviar el correo electrónico. Por simplicidad, estamos utilizando Console.WriteLine
para simular el envío de correo.
2.2 Registrar el Servicio en Startup.cs
Para que el contenedor de servicios pueda proporcionar MailService
cuando se necesite, debemos registrarlo en el método ConfigureServices
de Startup.cs
.
- Abre el archivo
Startup.cs
y localiza el métodoConfigureServices
. - Registra
MailService
como un servicio transitorio (transient):
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Registro del servicio de correo
services.AddTransient<IMailService>(provider => new MailService("smtp.example.com", 25));
}
En este código, services.AddTransient
registra MailService
como un servicio transitorio que implementa IMailService
. Esto significa que se creará una nueva instancia de MailService
cada vez que se inyecte IMailService
.
Nota: En algunas situaciones, es necesario registrar un servicio con parámetros específicos que no pueden ser directamente configurados a través de la inyección de dependencias estándar. En tales casos, se utiliza una expresión lambda para proporcionar una configuración personalizada:
services.AddTransient<IMailService>(provider => new MailService("smtp.example.com", 25));
.
Explicación sobre AddTransient<IMailService>(provider => new MailService("smtp.example.com", 25))
:
AddTransient<IMailService>(provider => new MailService("smtp.example.com", 25))
utiliza una expresión lambda para registrar el servicio.provider
es una instancia deIServiceProvider
que puede ser utilizada para resolver dependencias adicionales si es necesario.new MailService("smtp.example.com", 25)
crea una nueva instancia deMailService
con parámetros específicos, en este caso, la dirección del servidor SMTP y el puerto.- Este método es útil cuando los parámetros del constructor no pueden ser obtenidos a través del contenedor de servicios, como valores de configuración específicos que no están inyectados directamente.
Explicación sobre provider
:
provider
es una instancia de la interfazIServiceProvider
que es proporcionada por ASP.NET Core para resolver dependencias dentro del contenedor de servicios.- Cuando se utiliza una expresión lambda para registrar un servicio, como en el método con Expresión Lambda, se puede acceder a
provider
dentro de la lambda. - Esto permite resolver dependencias adicionales dentro de la expresión lambda si es necesario, lo que proporciona flexibilidad para configurar el servicio de manera más dinámica.
- Sin embargo, es importante usar esta funcionalidad con precaución para mantener la claridad y la legibilidad del código.
Paso 3: Inyectar y Usar el Servicio en un Controlador
3.1 Crear el Controlador
- Haz clic derecho en la carpeta
Controllers
y selecciona Add > Controller.... - Selecciona MVC Controller - Empty y haz clic en Add. Nombra el controlador
HomeController
.
3.2 Inyectar el Servicio en el Controlador
- Abre
HomeController.cs
y modifica el controlador para inyectarIMailService
a través del constructor:
using EmailServiceApp.Services;
using Microsoft.AspNetCore.Mvc;
namespace EmailServiceApp.Controllers
{
public class HomeController : Controller
{
private readonly IMailService _mailService;
public HomeController(IMailService mailService)
{
_mailService = mailService;
}
public IActionResult Index()
{
// Uso del servicio de correo para enviar un correo de prueba
_mailService.SendEmail("test@example.com", "Test Subject", "This is a test email.");
return View();
}
}
}
En este código, HomeController
tiene una dependencia de IMailService
, que se inyecta a través del constructor. Luego, en la acción Index
, utilizamos _mailService
para enviar un correo electrónico de prueba.
Paso 4: Configurar la Vista
- Haz clic derecho en la carpeta
Views
y selecciona Add > New Folder. Nombra la carpetaHome
. - Haz clic derecho en la carpeta
Home
y selecciona Add > New Item.... Selecciona Razor View y nombra la vistaIndex.cshtml
.
4.1 Crear la Vista Index.cshtml
- Abre
Index.cshtml
y añade contenido básico:
@{
ViewData["Title"] = "Home";
}
<h1>Welcome to Email Service App</h1>
<p>The email has been sent successfully. Check your console for details.</p>
En esta vista, simplemente mostramos un mensaje de bienvenida y una indicación de que el correo se ha enviado correctamente.
Paso 5: Ejecutar y Probar la Aplicación
5.1 Configuración de la Ruta Predeterminada
Para asegurarnos de que HomeController
se utilice como la página de inicio, debemos configurar la ruta predeterminada en Startup.cs
.
- Abre
Startup.cs
y modifica el métodoConfigure
para establecer la ruta predeterminada:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
En este código, endpoints.MapControllerRoute
establece HomeController
y su acción Index
como la ruta predeterminada.
5.2 Ejecutar la Aplicación
- Haz clic en el botón Run o presiona F5 en Visual Studio para iniciar la aplicación.
- Una vez que la aplicación esté en ejecución, abre el navegador web y navega a
https://localhost:5001
(o la URL que Visual Studio haya asignado a tu proyecto).
5.3 Verificar la Salida
- Si todo está configurado correctamente, deberías ver la página de inicio con el mensaje de bienvenida.
- Abre la consola de Visual Studio (puedes encontrarla en la pestaña Output en la parte inferior de la ventana de Visual Studio) y verifica que el mensaje del servicio de correo se haya impreso, indicando que el correo electrónico se ha "enviado":
Enviando correo a test@example.com con asunto Test Subject usando smtp.example.com:25
Este mensaje confirma que el servicio de correo se ha ejecutado correctamente y se ha utilizado la configuración proporcionada.
Conclusión
Este artículo ha proporcionado una guía detallada y paso a paso sobre cómo configurar una aplicación ASP.NET Core utilizando la inyección de dependencias para un servicio de correo electrónico (MailService
). Hemos cubierto desde la configuración del contenedor de servicios hasta la inyección y uso del servicio en un controlador, proporcionando ejemplos de código extensos y explicaciones detalladas para asegurar que cualquier programador pueda seguir estos pasos y obtener una aplicación funcional en Visual Studio.
Puntos Clave
- Creación del Proyecto: Iniciamos con la creación de un proyecto ASP.NET Core en Visual Studio.
- Configuración del Contenedor de Servicios: Definimos una interfaz
IMailService
y su implementaciónMailService
, y registramosMailService
en el contenedor de servicios como un servicio transitorio. - Inyección de Dependencias: Inyectamos
IMailService
en elHomeController
y utilizamos el servicio para enviar un correo electrónico de prueba. - Configuración de la Vista: Configuramos una vista Razor para mostrar un mensaje de éxito.
- Ejecución y Prueba: Ejecutamos la aplicación y verificamos la salida en la consola para asegurarnos de que el correo electrónico se ha enviado correctamente.
Recuerda que la inyección de dependencias es una práctica esencial para crear aplicaciones modulares y mantenibles. Al seguir estos pasos, no solo habrás creado una aplicación funcional, sino que también habrás aprendido principios clave de diseño que te ayudarán en proyectos futuros.
Próximos Pasos
Para ampliar este proyecto, en el próximo artículo de este Blog Inyección de Dependencias en ASP.NET Core: Un cliente SMTP (II), desarrollaremos las siguientes mejoras:
- Autenticación y Autorización: Agregar autenticación y autorización para proteger tu aplicación.
- Configuración de SMTP Real: Configurar un servidor SMTP real y utiliza una biblioteca como
System.Net.Mail
para enviar correos electrónicos reales. - Pruebas Unitarias: Implementar pruebas unitarias para asegurar que tu servicio de correo y otras partes de tu aplicación funcionen correctamente.
Nuevo comentario
Comentarios
No hay comentarios para este Post.