의존성 주입(Dependency Injection) 은
객체(컴포넌트)가 필요한 서비스나 객체를 직접 생성하지 않고,
외부에서 주입받도록 만드는 설계 방식입니다.
public class Food
{
public string Name { get; set; }
public int Price { get; set; }
}
public interface IFoodService
{
IEnumerable<Food> GetFoods();
}
public class FoodService : IFoodService
{
public IEnumerable<Food> GetFoods()
{
return new List<Food>
{
new Food() { Name = "Bibimbap", Price = 7000 },
new Food() { Name = "Kimbap", Price = 3000 },
new Food() { Name = "Bossam", Price = 9000 }
};
}
}
builder.Services.AddSingleton<IFoodService, FoodService>();
@inject IFoodService foodService
<div>
@foreach (var food in foodService.GetFoods())
{
<div>@food.Name</div>
<div>@food.Price</div>
}
</div>
public class PaymentService
{
private readonly IFoodService _foodService;
public PaymentService(IFoodService foodService)
{
_foodService = foodService;
}
public int GetTotalPrice()
{
return _foodService.GetFoods().Sum(f => f.Price);
}
}
builder.Services.AddSingleton<PaymentService>();
| 타입 | 특징 설명 |
|---|---|
| Singleton | 앱 실행 시 1번만 생성, 전역에서 공유됨 |
| Scoped | 요청당 1번 생성 (사용자 1명당 1개) |
| Transient | 요청마다 매번 새로 생성 |
builder.Services.AddSingleton<SingletonService>();
builder.Services.AddScoped<ScopedService>();
builder.Services.AddTransient<TransientService>();
@inject SingletonService singleton
@inject ScopedService scoped
@inject TransientService transient
<p>Singleton ID: @singleton.ID</p>
<p>Scoped ID: @scoped.ID</p>
<p>Transient ID: @transient.ID</p>