Implement environment-aware dependency injection to resolve EF Core provider conflict in Integration Tests. The issue was caused by both PostgreSQL and InMemory providers being registered in the same service provider. Changes: - Modified Identity Module DependencyInjection to skip PostgreSQL DbContext registration in Testing environment - Modified ProjectManagement Module ModuleExtensions with same environment check - Updated Program.cs to pass IHostEnvironment to both module registration methods - Added Microsoft.Extensions.Hosting.Abstractions package to Identity.Infrastructure project - Updated ColaFlowWebApplicationFactory to set Testing environment and register InMemory databases - Simplified WebApplicationFactory by removing complex RemoveAll logic Results: - All 31 Integration Tests now run (previously only 1 ran) - No EF Core provider conflict errors - 23 tests pass, 8 tests fail (failures are business logic issues, not infrastructure) - Production environment still uses PostgreSQL as expected 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
49 lines
2.1 KiB
C#
49 lines
2.1 KiB
C#
using ColaFlow.Modules.Identity.Application.Services;
|
|
using ColaFlow.Modules.Identity.Domain.Repositories;
|
|
using ColaFlow.Modules.Identity.Infrastructure.Persistence;
|
|
using ColaFlow.Modules.Identity.Infrastructure.Persistence.Repositories;
|
|
using ColaFlow.Modules.Identity.Infrastructure.Services;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Hosting;
|
|
|
|
namespace ColaFlow.Modules.Identity.Infrastructure;
|
|
|
|
public static class DependencyInjection
|
|
{
|
|
public static IServiceCollection AddIdentityInfrastructure(
|
|
this IServiceCollection services,
|
|
IConfiguration configuration,
|
|
IHostEnvironment? environment = null)
|
|
{
|
|
// Only register PostgreSQL DbContext in non-Testing environments
|
|
// In Testing environment, WebApplicationFactory will register InMemory provider
|
|
if (environment == null || environment.EnvironmentName != "Testing")
|
|
{
|
|
// DbContext (using connection string)
|
|
services.AddDbContext<IdentityDbContext>(options =>
|
|
options.UseNpgsql(
|
|
configuration.GetConnectionString("DefaultConnection"),
|
|
b => b.MigrationsAssembly(typeof(IdentityDbContext).Assembly.FullName)));
|
|
}
|
|
|
|
// Tenant Context (Scoped - one instance per request)
|
|
services.AddScoped<ITenantContext, TenantContext>();
|
|
services.AddHttpContextAccessor(); // Required for HttpContext access
|
|
|
|
// Repositories
|
|
services.AddScoped<ITenantRepository, TenantRepository>();
|
|
services.AddScoped<IUserRepository, UserRepository>();
|
|
services.AddScoped<IRefreshTokenRepository, RefreshTokenRepository>();
|
|
services.AddScoped<IUserTenantRoleRepository, UserTenantRoleRepository>();
|
|
|
|
// Application Services
|
|
services.AddScoped<IJwtService, JwtService>();
|
|
services.AddScoped<IPasswordHasher, PasswordHasher>();
|
|
services.AddScoped<IRefreshTokenService, RefreshTokenService>();
|
|
|
|
return services;
|
|
}
|
|
}
|