보기에는 종속성 주입Dependency injection into views

으로 Steve SmithBy Steve Smith

ASP.NET Core 지원 종속성 주입 뷰로 합니다.ASP.NET Core supports dependency injection into views. 이 지역화 또는 데이터 요소 보기를 채우는 경우에 필요 같은 보기 관련 서비스에 대 한 유용할 수 있습니다.This can be useful for view-specific services, such as localization or data required only for populating view elements. 유지 관리 하는 것이 좋습니다 문제의 분리 컨트롤러와 뷰 사이입니다.You should try to maintain separation of concerns between your controllers and views. 컨트롤러에서 대부분의 보기를 표시 하는 데이터에 전달 되어야 합니다.Most of the data your views display should be passed in from the controller.

보거나 다운로드 샘플 코드 (다운로드 하는 방법을)View or download sample code (how to download)

간단한 예A Simple Example

서비스를 사용 하 여 보기에 삽입할 수는 @inject 지시문입니다.You can inject a service into a view using the @inject directive. 생각할 수 있으며 @inject 속성을 보기에 추가 하 고 채우기 DI를 사용 하는 속성으로.You can think of @inject as adding a property to your view, and populating the property using DI.

에 대 한 구문 @inject:@inject <type> <name>The syntax for @inject: @inject <type> <name>

예로 @inject 실행에서:An example of @inject in action:

@using System.Threading.Tasks
@using ViewInjectSample.Model
@using ViewInjectSample.Model.Services
@model IEnumerable<ToDoItem>
@inject StatisticsService StatsService
<!DOCTYPE html>
<html>
<head>
    <title>To Do Items</title>
</head>
<body>
    <div>
        <h1>To Do Items</h1>
        <ul>
            <li>Total Items: @StatsService.GetCount()</li>
            <li>Completed: @StatsService.GetCompletedCount()</li>
            <li>Avg. Priority: @StatsService.GetAveragePriority()</li>
        </ul>
        <table>
            <tr>
                <th>Name</th>
                <th>Priority</th>
                <th>Is Done?</th>
            </tr>
            @foreach (var item in Model)
            {
                <tr>
                    <td>@item.Name</td>
                    <td>@item.Priority</td>
                    <td>@item.IsDone</td>
                </tr>
            }
        </table>
    </div>
</body>
</html>

이 보기의 목록이 표시 됩니다. ToDoItem 인스턴스에 대 한 전체 통계를 보여 주는 요약 정보와 함께 합니다.This view displays a list of ToDoItem instances, along with a summary showing overall statistics. 요약 채워집니다는 삽입 된에서 StatisticsService합니다.The summary is populated from the injected StatisticsService. 이 서비스의 종속성 주입에 등록 되어 ConfigureServicesStartup.cs:This service is registered for dependency injection in ConfigureServices in Startup.cs:

// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddTransient<IToDoItemRepository, ToDoItemRepository>();
    services.AddTransient<StatisticsService>();
    services.AddTransient<ProfileOptionsService>();

StatisticsService 집합에 대해 몇 가지 계산을 수행한 ToDoItem 리포지토리를 통한 액세스 하는 인스턴스:The StatisticsService performs some calculations on the set of ToDoItem instances, which it accesses via a repository:

using System.Linq;
using ViewInjectSample.Interfaces;

namespace ViewInjectSample.Model.Services
{
    public class StatisticsService
    {
        private readonly IToDoItemRepository _toDoItemRepository;

        public StatisticsService(IToDoItemRepository toDoItemRepository)
        {
            _toDoItemRepository = toDoItemRepository;
        }

        public int GetCount()
        {
            return _toDoItemRepository.List().Count();
        }

        public int GetCompletedCount()
        {
            return _toDoItemRepository.List().Count(x => x.IsDone);
        }

        public double GetAveragePriority()
        {
            if (_toDoItemRepository.List().Count() == 0)
            {
                return 0.0;
            }

            return _toDoItemRepository.List().Average(x => x.Priority);
        }
    }
}

샘플 리포지토리는 메모리 내 컬렉션을 사용합니다.The sample repository uses an in-memory collection. 위에 표시 된 구현 (에서 작동 하는 모든 데이터를 메모리에에서) 원격으로 액세스, 대규모 데이터 집합에 대 한 권장 되지 않습니다.The implementation shown above (which operates on all of the data in memory) is not recommended for large, remotely accessed data sets.

샘플 데이터를 보기에 바인딩된 모델 및 보기에 포함할 서비스를 표시 합니다.The sample displays data from the model bound to the view and the service injected into the view:

총 항목 나열 표시 작업을 실행 하려면 항목과 평균 우선 순위는 우선 순위 수준 및 완료를 나타내는 부울 값을 사용 하 여 작업의 목록이 완료 합니다.

조회 데이터 채우기Populating Lookup Data

보기 주입 UI 요소를 드롭다운 목록에서 옵션을 채우는 데 유용할 수 있습니다.View injection can be useful to populate options in UI elements, such as dropdown lists. 성별, 상태 및 기타 기본 설정을 지정 하기 위한 옵션을 포함 하는 사용자 프로필 양식을 것이 좋습니다.Consider a user profile form that includes options for specifying gender, state, and other preferences. 컨트롤러를 각 옵션의이 집합에 대 한 데이터 액세스 서비스를 요청 하 고 모델을 채울 필요 폼 표준 MVC 방식을 사용 하 여 렌더링 또는 ViewBag 각 바인딩하는 옵션 집합을 사용 합니다.Rendering such a form using a standard MVC approach would require the controller to request data access services for each of these sets of options, and then populate a model or ViewBag with each set of options to be bound.

다른 접근 방식은 옵션이 적용 하 여 보기에 직접 서비스를 삽입 합니다.An alternative approach injects services directly into the view to obtain the options. 이 뷰 자체에이 보기 요소 생성 논리는 이동 하는 컨트롤러에 필요한 코드의 양을 최소화 합니다.This minimizes the amount of code required by the controller, moving this view element construction logic into the view itself. 컨트롤러 동작 프로필 편집 폼을 표시만 폼 프로필 인스턴스를 전달 해야 합니다.The controller action to display a profile editing form only needs to pass the form the profile instance:

using Microsoft.AspNetCore.Mvc;
using ViewInjectSample.Model;

namespace ViewInjectSample.Controllers
{
    public class ProfileController : Controller
    {
        [Route("Profile")]
        public IActionResult Index()
        {
            // TODO: look up profile based on logged-in user
            var profile = new Profile()
            {
                Name = "Steve",
                FavColor = "Blue",
                Gender = "Male",
                State = new State("Ohio","OH")
            };
            return View(profile);
        }
    }
}

이러한 기본 설정을 업데이트 하는 데 사용 하는 HTML 폼 속성에 대 한 드롭다운 목록이 포함 됩니다.The HTML form used to update these preferences includes dropdown lists for three of the properties:

이름, 성별, 상태 및 좋아하는 색을 입력할 수는 폼으로 프로필 보기를 업데이트 합니다.

이러한 목록 보기에 삽입 되었는지를 서비스에서 채워집니다.These lists are populated by a service that has been injected into the view:

@using System.Threading.Tasks
@using ViewInjectSample.Model.Services
@model ViewInjectSample.Model.Profile
@inject ProfileOptionsService Options
<!DOCTYPE html>
<html>
<head>
    <title>Update Profile</title>
</head>
<body>
<div>
    <h1>Update Profile</h1>
    Name: @Html.TextBoxFor(m => m.Name)
    <br/>
    Gender: @Html.DropDownList("Gender",
           Options.ListGenders().Select(g => 
                new SelectListItem() { Text = g, Value = g }))
    <br/>

    State: @Html.DropDownListFor(m => m.State.Code,
           Options.ListStates().Select(s => 
                new SelectListItem() { Text = s.Name, Value = s.Code}))
    <br />

    Fav. Color: @Html.DropDownList("FavColor",
           Options.ListColors().Select(c => 
                new SelectListItem() { Text = c, Value = c }))
    </div>
</body>
</html>

ProfileOptionsService 는이 형식에 필요한 데이터를 제공 하도록 설계 된 UI 수준 서비스:The ProfileOptionsService is a UI-level service designed to provide just the data needed for this form:

using System.Collections.Generic;

namespace ViewInjectSample.Model.Services
{
    public class ProfileOptionsService
    {
        public List<string> ListGenders()
        {
            // keeping this simple
            return new List<string>() {"Female", "Male"};
        }

        public List<State> ListStates()
        {
            // a few states from USA
            return new List<State>()
            {
                new State("Alabama", "AL"),
                new State("Alaska", "AK"),
                new State("Ohio", "OH")
            };
        }

        public List<string> ListColors()
        {
            return new List<string>() { "Blue","Green","Red","Yellow" };
        }
    }
}

종속성 주입을 통해 요청 하는 형식을 등록 하도록 설정 된 ConfigureServices 에서 메서드 Startup.cs합니다.Don't forget to register types you will request through dependency injection in the ConfigureServices method in Startup.cs.

서비스를 재정의합니다.Overriding Services

새로운 서비스를 삽입 하는 것 외에도이 방법은 재정의 하는 페이지에서 이전에 삽입 된 서비스를 데도 수 있습니다.In addition to injecting new services, this technique can also be used to override previously injected services on a page. 아래 그림에서는 첫 번째 예에 사용 된 페이지에서 모든 사용 가능한 필드를 보여 줍니다.The figure below shows all of the fields available on the page used in the first example:

Intellisense 상황에 맞는 메뉴에서 형식화 된 @ 기호를 Html, 구성 요소, StatsService, 및 Url 필드를 나열 합니다.

기본 필드를 포함 하는 볼 수 있듯이 Html, Component, 및 Url (으로 StatsService म 삽입 하는).As you can see, the default fields include Html, Component, and Url (as well as the StatsService that we injected). 예를 들어 기본 HTML 도우미를 사용자의 대체 하 려 했다면, 수행할 수 있습니다 쉽게 사용 하 여 변경할 @inject:If for instance you wanted to replace the default HTML Helpers with your own, you could easily do so using @inject:

@using System.Threading.Tasks
@using ViewInjectSample.Helpers
@inject MyHtmlHelper Html
<!DOCTYPE html>
<html>
<head>
    <title>My Helper</title>
</head>
<body>
    <div>
        Test: @Html.Value
    </div>
</body>
</html>

기존 서비스를 확장 하려는 경우에서 상속 하거나 자신의 기존 구현을 배치 하는 동안 단순히이 기법을 사용할 수 있습니다.If you want to extend existing services, you can simply use this technique while inheriting from or wrapping the existing implementation with your own.

참고 항목See Also