ASPNET 6 Web API & Refactoring with Extension Method

서론

ASPNET 6 Web API 는 Startup.cs 라는 초기화 및 설정 변경을 지정할 수 있는 class 가 사라졌다. 그로인해 대부분의 초기화 코드와 설정 코드들이 program.cs 에 위치하게 된다. 

문제점

Project 자체가 크지 않을때는 상관 없으나 프로젝트가 점점 거대해지고 복잡해 지게 되면 Program.cs 파일 자체도 덩달아 거대하고 복잡하게 된다. 
그렇게 되면 관리하기 힘든 프로젝트가 되고 말것이다. 

해결책

Extension method 를 통해 refactoring 을 해보자

아래 기능들을 Extension method 를 통해 refactoring 해보자
1. IServiceCollection 연관 작업들

2. IHostBuilder 연관 작업들

3. IApplicationBuilder 연관 작업들


1. Extensions 폴더 생성 및 Extension class 생성

IServiceCollectionExtension.cs 생성

아래코드 추가
public static class IServiceCollectionExtension
{
    public static void InitController(this IServiceCollection self)
    {
        self.AddControllers();
        self.AddEndpointsApiExplorer();
    }
}

IHostBuilderExtension.cs 생성

아래코드 추가
public static class IHostBuilderExtension
{
    public static void AddSeriLog(this IHostBuilder self)
    {
        self.UseSerilog((ctx, lc) => lc
                        .ReadFrom.Configuration(ctx.Configuration));
        
    }
}

IApplicationBuilderExtension.cs 생성

아래코드 추가
public static class IApplicationBuilderExtension
{
    public static void UseSwaggerAndUI(this IApplicationBuilder self)
    {
        self.UseSwagger();
        self.UseSwaggerUI();
    }
}



2. Program.cs 변경

코드 추가 
using WebApiBasicEmpty.Extensions;


AddControllers 및 AddEndpointsApiExplorer 변경

코드 삭제
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();

코드 추가
builder.Services.InitController();



UseSerilog 변경

코드 삭제
builder.Host.UseSerilog((ctx, lc) => lc
        .ReadFrom.Configuration(ctx.Configuration));

코드 추가
builder.Host.AddSeriLog();



Use.Swagger 및 UseSwaggerUI 변경

코드 삭제
app.UseSwagger(); app.UseSwaggerUI();

코드 추가
app.UseSwaggerAndUI();


이제 완료 되었다. 
실행 하면 지금까지와 같은 동작을 하게 될것 이다.

이런방법을 응용하여 Extension Method 를 이용해
몇몇 config 을 grouping 처리 하거나 설정관련 코드를 extension  쪽으로 이동하여
program.cs 를 단순화 시킬 수 있다.


관련영상


댓글

이 블로그의 인기 게시물

Mediator

ASPNET 6 Web Api Basic Tutorial 1 / 2 (Swagger, SeriLog, MediatR, EntityFrameworkCore, Scrutor)

Dependency Injection Customization