using AutoMapper; using CleanArchitecture.Application.Common.Behaviours; using FluentValidation; using MediatR; using Microsoft.Extensions.DependencyInjection; using System.Reflection; using CleanArchitecture.Application.Common.Interfaces; using CleanArchitecture.Infrastructure.Files; using CleanArchitecture.Infrastructure.Identity; using CleanArchitecture.Infrastructure.Persistence; using CleanArchitecture.Infrastructure.Services; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; namespace CleanArchitecture.Application { public static class DependencyInjection { public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) { if (configuration.GetValue<bool>("UseInMemoryDatabase")) { services.AddDbContext<ApplicationDbContext>(options => options.UseInMemoryDatabase("CleanArchitectureDb")); } else { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); } services.AddScoped<IApplicationDbContext>(provider => provider.GetService<ApplicationDbContext>()); services.AddScoped<IDomainEventService, DomainEventService>(); services .AddDefaultIdentity<ApplicationUser>() .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddIdentityServer() .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(); services.AddTransient<IDateTime, DateTimeService>(); services.AddTransient<IIdentityService, IdentityService>(); services.AddTransient<ICsvFileBuilder, CsvFileBuilder>(); services.AddAuthentication() .AddIdentityServerJwt(); services.AddAuthorization(options => { options.AddPolicy("CanPurge", policy => policy.RequireRole("Administrator")); }); return services; } public static IServiceCollection AddApplication(this IServiceCollection services) { services.AddAutoMapper(Assembly.GetExecutingAssembly()); services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly()); services.AddMediatR(Assembly.GetExecutingAssembly()); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(UnhandledExceptionBehaviour<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(AuthorizationBehaviour<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehaviour<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(PerformanceBehaviour<,>)); return services; } } }