물건을 주입하는 더 좋은 방법
서비스, 리포지토리, 속성 또는 애플리케이션에 삽입할 모든 항목을 구축할 때마다 실제로 애플리케이션에 서비스를 추가하는 이 단계를 수행해야 합니다.
이것은 항상 동일합니다. 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();
이게 훨씬 더 깔끔해 보이지 않나요? 글쎄요, 우리는 일부 서비스와 리포지토리를 성공적으로 주입했지만 이제 더 보기 좋아 보이고 실제로 외부 라이브러리에 주입한 내용을 갖게 되었습니다.