40using System.Reflection;
41using System.Text.Json.Serialization;
42using FluentValidation;
44using Microsoft.AspNetCore.Authentication.JwtBearer;
45using Microsoft.Data.Sqlite;
46using Microsoft.EntityFrameworkCore;
47using Microsoft.IdentityModel.Tokens;
55var
builder = WebApplication.CreateBuilder(args);
59builder.Configuration.AddUserSecrets(Assembly.GetExecutingAssembly(), optional: true);
61const string connectionString =
"Data Source=file:taskmanagement?mode=memory&cache=shared";
62builder.Configuration.AddInMemoryCollection(
new Dictionary<string, string?> {
66builder.Services.AddSingleton<SqliteConnection>(_ => {
75 .GetSection(
"ValidAudiences")
76 .Get<
string[]>() ?? [];
78 .GetSection(
"SigningKeys")
80 .Select(x => x[
"Value"])
81 .Where(x => !
string.IsNullOrWhiteSpace(x))
82 .Select(x =>
new SymmetricSecurityKey(Convert.FromBase64String(x!)))
87 .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
88 .AddJwtBearer(options => {
89 options.TokenValidationParameters =
new TokenValidationParameters {
90 ValidateIssuer = !
string.IsNullOrWhiteSpace(
validIssuer),
94 ValidateIssuerSigningKey =
true,
96 ValidateLifetime =
true,
97 TryAllIssuerSigningKeys =
true,
98 ClockSkew = TimeSpan.FromMinutes(1)
109 options.UseSqlite(
builder.Configuration.GetConnectionString(
"DefaultConnection")))
110 .AddScoped<IUnitOfWork>(sp => sp.GetRequiredService<
TaskDbContext>())
111 .AddScoped<ITaskRepository, TaskRepository>()
113 .AddScoped<IDomainEventDispatcher, MediatRDomainEventDispatcher>()
115 .AddJsonOptions(options => {
116 options.JsonSerializerOptions.Converters.Add(
new JsonStringEnumConverter());
123 dbContext.Database.EnsureCreated();
app.Services.CreateScope()) { var dbContext=scope.ServiceProvider.GetRequiredService< TaskDbContext >() scope
builder.Services. typeof(ValidationBehavior<,>)) .AddDbContext< TaskDbContext >(options
const string connectionString
Partial Program class made public for testing purposes. Allows WebApplicationFactory to access the Pr...
ExceptionHandlingMiddleware es middleware de ASP.NET Core para manejo centralizado de excepciones.
ValidationBehavior es un comportamiento de pipeline de MediatR para validar comandos y consultas.
CreateTaskCommand encapsula la solicitud de creación de una nueva tarea.
TaskReadRepository es el repositorio de lectura para consultas de tarea optimizadas.
TaskDbContext es el DbContext de Entity Framework Core para gestión de tareas.
ITaskReadRepository es la abstracción para consultas de sólo lectura de tareas.