A component of ASP.NET Core for creating RESTful web services that support HTTP-based communication between clients and servers.
Hi,
You can follow these steps to create and manage your service for sending emails or SMS with TryAddTransient
1. Create Interface
Define contracts for messaging providers and the main service. IMessageProvider ensures all providers (SMS, Email, etc.) have the same structure. IMessageService handles coordination between multiple providers.
public interface IMessageProvider
{
string ProviderName { get; }
Task SendAsync(string recipient, string message);
}
public interface IMessageService
{
Task SendToAllAsync(string recipient, string message);
}
2. Implement Providers
Create concrete classes for each messaging method (SMS, Email). Each implements IMessageProvider and contains the actual logic for sending messages through that specific channel.
public class SmsProvider : IMessageProvider
{
public string ProviderName => "SMS";
public async Task SendAsync(string recipient, string message)
{
// Your SMS API logic here
Console.WriteLine($"SMS sent to {recipient}: {message}");
}
}
public class EmailProvider : IMessageProvider
{
public string ProviderName => "Email";
public async Task SendAsync(string recipient, string message)
{
// Your Email API logic here
Console.WriteLine($"Email sent to {recipient}: {message}");
}
}
3. Create Main Service
The MessageService coordinates all providers. It receives IEnumerable<IMessageProvider> through dependency injection, which automatically includes all registered providers. It loops through each provider to send messages.
public class MessageService : IMessageService
{
private readonly IEnumerable<IMessageProvider> _providers;
public MessageService(IEnumerable<IMessageProvider> providers)
{
_providers = providers;
}
public async Task SendToAllAsync(string recipient, string message)
{
foreach (var provider in _providers)
{
await provider.SendAsync(recipient, message);
}
}
}
4. Register Services with TryAddTransient
Configure dependency injection in Program.cs. TryAddTransient registers services only if they're not already registered. Multiple IMessageProvider registrations create a collection that gets injected into MessageService.
using Microsoft.Extensions.DependencyInjection.Extensions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
// Register providers using TryAddTransient
builder.Services.TryAddTransient<IMessageProvider, SmsProvider>();
builder.Services.TryAddTransient<IMessageProvider, EmailProvider>();
builder.Services.TryAddTransient<IMessageService, MessageService>();
var app = builder.Build();
app.MapControllers();
app.Run();
5. Create Controller
The API controller handles HTTP requests. It injects IMessageService and exposes an endpoint to send messages. The controller acts as the entry point for external clients.
[ApiController]
[Route("api/[controller]")]
public class MessagingController : ControllerBase
{
private readonly IMessageService _messageService;
public MessagingController(IMessageService messageService)
{
_messageService = messageService;
}
[HttpPost("send")]
public async Task<IActionResult> SendMessage([FromBody] MessageRequest request)
{
await _messageService.SendToAllAsync(request.Recipient, request.Message);
return Ok("Messages sent to all providers");
}
}
public class MessageRequest
{
public string Recipient { get; set; }
public string Message { get; set; }
}
6. Test the API
To test the ASP.NET Web API using HTTP requests, you can use tools like Postman, curl, or the built-in Swagger UI (available at /swagger in development) to send POST requests to your messaging endpoint.
Using curl:
curl -X POST "https://localhost:5001/api/messaging/send" \
-H "Content-Type: application/json" \
-d "{
\"recipient\": \"user@example.com\",
\"message\": \"Hello World!\"
}"
Using Postman:
POST https://localhost:5001/api/messaging/send
Content-Type: application/json
{
"recipient": "user@example.com",
"message": "Hello World!"
}
Using C# HttpClient (for integration testing):
public class MessagingApiTests
{
private readonly HttpClient _client;
public MessagingApiTests()
{
var factory = new WebApplicationFactory<Program>();
_client = factory.CreateClient();
}
[Test]
public async Task SendMessage_ShouldReturnOk()
{
var request = new { recipient = "test@example.com", message = "Test message" };
var json = JsonSerializer.Serialize(request);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _client.PostAsync("/api/messaging/send", content);
response.StatusCode.Should().Be(HttpStatusCode.OK);
}
}
Hope this helps