물건을 주입하는 더 좋은 방법

· 2분 읽기

서비스, ​​리포지토리, 속성 또는 애플리케이션에 삽입할 모든 항목을 구축할 때마다 실제로 애플리케이션에 서비스를 추가하는 이 단계를 수행해야 합니다.

이것은 항상 동일합니다. Program.cs로 이동한 다음 서비스를 주입하기 위해 파일 추가 builder.Services.AddScoped<MyService>();의 일부로 진행합니다.

다음과 같은 것 :

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

// Repositories
builder.Services.AddScoped<ARepository>(); // 👀
builder.Services.AddScoped<BRepository>(); // 👀

// Services
builder.Services.AddScoped<AService>(); // 👀
builder.Services.AddScoped<BService>(); // 👀
builder.Services.AddScoped<CService>(); // 👀
builder.Services.AddScoped<DService>(); // 👀

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

제 말은, 효과는 있지만 제가 까다롭고 별로 좋아하지 않는다는 거죠.

우리가 수행하려는 종속성 주입이 여러 개 있고 실제로는 동일한 것이 아니라고 가정해 보겠습니다. 제 경우에는 모든 저장소를 포함하는 라이브러리, 모든 서비스를 포함하는 또 다른 라이브러리, 마지막으로 속성을 포함하는 또 다른 라이브러리를 갖는 것과 같을 수 있습니다.

그렇다면 Program.cs에 추가해야 할 줄의 양을 상상할 수 있습니까?

일부 서비스가 포함된 라이브러리가 있다고 가정해 보겠습니다. 모든 서비스를 포함하려면 IServiceCollection를 사용하여 작업해야 합니다.

따라서 IServiceCollection를 반환하는 AddServices라는 static 메서드를 갖는 static class를 생성하겠습니다.

이 경우 이름은 IServiceCollectionServicesExtensions로 지정됩니다.

/// <summary>
/// IServiceCollectionServicesExtensions class
/// </summary>
public static class IServiceCollectionServicesExtensions
{
    /// <summary>
    /// AddCoreServices
    /// </summary>
    /// <param cref="IServiceCollection" name="services">Parameter for <see cref="IServiceCollection"/></param>
    /// <returns>An object of type <see cref="IServiceCollection"/></returns>
    public static IServiceCollection AddServices(this IServiceCollection services)
    {
        services
            .AddScoped<AService>()
            .AddScoped<BService>()
            .AddScoped<CService>()
            .AddScoped<DService>();

        return services;
    }
}

뿐만 아니라 이 서비스에서 사용되는 일부 저장소를 포함하는 또 다른 라이브러리도 있으므로 동일한 작업을 수행해 보겠습니다.

/// <summary>
/// IServiceCollectionServicesExtensions class
/// </summary>
public static class IServiceCollectionServicesExtensions
{
    /// <summary>
    /// AddCoreServices
    /// </summary>
    /// <param cref="IServiceCollection" name="services">Parameter for <see cref="IServiceCollection"/></param>
    /// <returns>An object of type <see cref="IServiceCollection"/></returns>
    public static IServiceCollection AddRepositories(this IServiceCollection services)
    {
        services
            .AddScoped<ARepository>()
            .AddScoped<BRepository>();

        return services;
    }
}

이제 주입할 리포지토리와 서비스 메서드가 생겼습니다. 그런데 이를 어떻게 사용합니까?

Program.cs로 돌아가서 다음을 추가해 보겠습니다.

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

// Repositories
builder.Services.AddRepositories(); // 👀

// Services
builder.Services.AddServices(); // 👀

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

이게 훨씬 더 깔끔해 보이지 않나요? 글쎄요, 우리는 일부 서비스와 리포지토리를 성공적으로 주입했지만 이제 더 보기 좋아 보이고 실제로 외부 라이브러리에 주입한 내용을 갖게 되었습니다.