I am implementing a project using Clean Architecture in .NET 6. As per the Clean Architecture principle we should not reference Infrastructure layer in Web Api(Presentation layer), we should only access Application layer in Web Api.
So how can I register Infrastructure layer's dependencies without violating the Clean Architecture principle? I have created below extension method in Infrastructure layer to register dependencies:
namespace JwtWithIdentityDemo.Infrastructure.IoC
{
public static class RegisterInfrastructure
{
public static void AddInfrastructure(this IServiceCollection services,
IConfiguration configuration)
{
services.Configure<JwtSetings>(configuration.GetSection(JwtSetings.SectionName));
services.AddSingleton<IJwtTokenGenerator, JwtTokenGenerator>();
services.AddTransient<IUserManagerWrapper, UserManagerWrapper>();
// For Identity
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<UserManager<IdentityUser>>();
// For Entity Framework
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(configuration.GetConnectionString("JwtWithIdentityDemoDb"),
sqlServerOptions => sqlServerOptions.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName)
.EnableRetryOnFailure(
maxRetryCount: 5,
maxRetryDelay: TimeSpan.FromSeconds(30),
errorNumbersToAdd: null)
),
ServiceLifetime.Transient
);
}
}
}
If I call AddInfrastructure
method in Program.cs then I have to add reference of Infrastructure library, which is violating the Clean Architecture's principles.
var builder = WebApplication.CreateBuilder(args);
{
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<Program>());
builder.Services.AddApplication(builder.Configuration);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddInfrastructure(builder.Configuration)
}
Aucun commentaire:
Enregistrer un commentaire