ASP.NET Core의 컨트롤러에 종속성 주입Dependency injection into controllers in ASP.NET Core

작성자: Shadi Namrouti, Rick AndersonSteve SmithBy Shadi Namrouti, Rick Anderson, and Steve Smith

ASP.NET Core MVC 컨트롤러는 생성자를 통해 명시적으로 종속성을 요청합니다.ASP.NET Core MVC controllers request dependencies explicitly via constructors. ASP.NET Core는 기본적으로 DI(종속성 주입)를 지원합니다.ASP.NET Core has built-in support for dependency injection (DI). DI를 사용하면 앱의 테스트와 유지 관리가 쉬워집니다.DI makes apps easier to test and maintain.

예제 코드 살펴보기 및 다운로드 (다운로드 방법)View or download sample code (how to download)

생성자 주입Constructor Injection

서비스는 생성자 매개 변수로 추가되며, 런타임은 서비스 컨테이너에서 서비스를 해결합니다.Services are added as a constructor parameter, and the runtime resolves the service from the service container. 서비스는 일반적으로 인터페이스를 사용하여 정의됩니다.Services are typically defined using interfaces. 예를 들어, 현재 시간이 필요한 앱을 고려해보세요.For example, consider an app that requires the current time. 다음 인터페이스는 IDateTime 서비스를 노출합니다.The following interface exposes the IDateTime service:

public interface IDateTime
{
    DateTime Now { get; }
}

다음 코드는 IDateTime 인터페이스를 구현합니다.The following code implements the IDateTime interface:

public class SystemDateTime : IDateTime
{
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
}

서비스를 서비스 컨테이너에 추가합니다.Add the service to the service container:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

AddSingleton에 대한 자세한 내용은 DI 서비스 수명을 참조하세요.For more information on AddSingleton, see DI service lifetimes.

다음 코드는 현재 시간을 기준으로 사용자에게 인사말을 표시합니다.The following code displays a greeting to the user based on the time of day:

public class HomeController : Controller
{
    private readonly IDateTime _dateTime;

    public HomeController(IDateTime dateTime)
    {
        _dateTime = dateTime;
    }

    public IActionResult Index()
    {
        var serverTime = _dateTime.Now;
        if (serverTime.Hour < 12)
        {
            ViewData["Message"] = "It's morning here - Good Morning!";
        }
        else if (serverTime.Hour < 17)
        {
            ViewData["Message"] = "It's afternoon here - Good Afternoon!";
        }
        else
        {
            ViewData["Message"] = "It's evening here - Good Evening!";
        }
        return View();
    }

앱을 실행하면 시간을 기준으로 메시지가 표시됩니다.Run the app and a message is displayed based on the time.

FromServices를 이용한 작업 주입Action injection with FromServices

FromServicesAttribute를 사용하면 생성자 주입을 사용하지 않고 작업 메서드에 직접 서비스를 주입할 수 있습니다.The FromServicesAttribute enables injecting a service directly into an action method without using constructor injection:

public IActionResult About([FromServices] IDateTime dateTime)
{
    ViewData["Message"] = $"Current server time: {dateTime.Now}";

    return View();
}

컨트롤러에서 설정 액세스Access settings from a controller

컨트롤러 내에서 앱 또는 구성 설정에 액세스하는 것은 일반적인 패턴입니다.Accessing app or configuration settings from within a controller is a common pattern. ASP.NET Core의 옵션 패턴에 설명된 옵션 패턴은 설정을 관리하기 위해 선호되는 방법입니다.The options pattern described in ASP.NET Core의 옵션 패턴 is the preferred approach to manage settings. 일반적으로 컨트롤러에 IConfiguration을 직접 주입하지 마세요.Generally, don't directly inject IConfiguration into a controller.

옵션을 나타내는 클래스를 만듭니다.Create a class that represents the options. 예:For example:

public class SampleWebSettings
{
    public string Title { get; set; }
    public int Updates { get; set; }
}

서비스 컬렉션에 구성 클래스를 추가합니다.Add the configuration class to the services collection:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();
    services.Configure<SampleWebSettings>(Configuration);
    
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

JSON 형식 파일에서 설정을 읽도록 앱을 구성합니다.Configure the app to read the settings from a JSON-formatted file:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("samplewebsettings.json", 
                                optional: false,        // File is not optional.
                                reloadOnChange: false);
        })
        .UseStartup<Startup>();
}

다음 코드는 서비스 컨테이너에서 IOptions<SampleWebSettings> 설정을 요청하고 이를 Index 메서드에 사용합니다.The following code requests the IOptions<SampleWebSettings> settings from the service container and uses them in the Index method:

public class SettingsController : Controller
{
    private readonly SampleWebSettings _settings;

    public SettingsController(IOptions<SampleWebSettings> settingsOptions)
    {
        _settings = settingsOptions.Value;
    }

    public IActionResult Index()
    {
        ViewData["Title"] = _settings.Title;
        ViewData["Updates"] = _settings.Updates;
        return View();
    }
}

추가 자료Additional resources