다음을 통해 공유


ASP.NET MVC 4 종속성 주입

웹 캠프 팀별

웹 캠프 교육 키트 다운로드

이 실습 랩에서는 ASP.NET MVC 및 ASP.NET MVC 4 필터에 대한 기본 지식이 있다고 가정합니다. 이전에 ASP.NET MVC 4 필터를 사용하지 않은 경우 MVC 사용자 지정 작업 필터 실습 랩을 ASP.NET 진행하는 것이 좋습니다.

참고 항목

모든 샘플 코드 및 코드 조각은 Microsoft-Web/WebCampTrainingKit 릴리스에서 사용할 수 있는 웹 캠프 교육 키트에 포함되어 있습니다. 이 랩과 관련된 프로젝트는 ASP.NET MVC 4 종속성 주입에서 사용할 수 있습니다.

개체 지향 프로그래밍 패러다임에서 개체는 기여자와 소비자가 있는 공동 작업 모델에서 함께 작동합니다. 당연히 이 통신 모델은 개체와 구성 요소 간의 종속성을 생성하므로 복잡성이 증가할 때 관리하기가 어려워집니다.

클래스 종속성 및 모델 복잡성

클래스 종속성 및 모델 복잡성

클라이언트 개체가 종종 서비스 위치를 담당하는 서비스를 사용하여 팩터리 패턴과 인터페이스와 구현 간의 분리에 대해 들어보셨을 것입니다.

종속성 주입 패턴은 제어 반전의 특정 구현입니다. IoC(Inversion of Control) 는 개체가 작업을 수행하는 데 의존하는 다른 개체를 만들지 않음을 의미합니다. 대신 외부 원본(예: xml 구성 파일)에서 필요한 개체를 가져옵니다.

DI(종속성 주입) 는 일반적으로 생성자 매개 변수를 전달하고 속성을 설정하는 프레임워크 구성 요소에 의해 개체 개입 없이 수행된다는 것을 의미합니다.

DI(종속성 주입) 디자인 패턴

높은 수준에서 종속성 주입의 목표는 클라이언트 클래스(예: 골퍼)에게 인터페이스를 충족하는 항목(예: IClub)이 필요하다는 것입니다. 콘크리트 유형(예: WoodClub, IronClub, WedgeClub 또는 PutterClub)은 다른 사람이 이를 처리하기를 원합니다(예: 좋은 캐디). ASP.NET MVC의 종속성 확인자를 사용하면 다른 곳에 종속성 논리를 등록할 수 있습니다(예: 컨테이너 또는 클럽 모음).

종속성 주입 다이어그램

종속성 주입 - 골프 비유

종속성 주입 패턴과 제어 반전을 사용할 경우의 장점은 다음과 같습니다.

  • 클래스 결합 감소
  • 코드 재사용 증가
  • 코드 유지 관리 기능 향상
  • 애플리케이션 테스트 개선

참고 항목

종속성 주입은 경우에 따라 추상 팩터리 디자인 패턴과 비교되지만 두 방법 간에 약간의 차이가 있습니다. DI에는 팩터리 및 등록된 서비스를 호출하여 종속성을 해결하기 위해 작업하는 프레임워크가 있습니다.

종속성 주입 패턴을 이해했으므로 이 랩 전체에서 ASP.NET MVC 4에서 적용하는 방법을 알아봅니다. 컨트롤러에서 종속성 주입을 사용하여 데이터베이스 액세스 서비스를 포함하기 시작합니다 . 다음으로, 뷰에 종속성 주입을 적용하여 서비스를 사용하고 정보를 표시합니다. 마지막으로, DI를 ASP.NET MVC 4 필터로 확장하여 솔루션에 사용자 지정 작업 필터를 삽입합니다.

이 실습 랩에서는 다음 방법을 알아봅니다.

  • NuGet 패키지를 사용하여 종속성 주입을 위한 Unity와 ASP.NET MVC 4 통합
  • ASP.NET MVC 컨트롤러 내에서 종속성 주입 사용
  • ASP.NET MVC 뷰 내에서 종속성 주입 사용
  • ASP.NET MVC 작업 필터 내에서 종속성 주입 사용

참고 항목

이 랩에서는 종속성 해결을 위해 Unity.Mvc3 NuGet 패키지를 사용하지만 ASP.NET MVC 4와 함께 작동하도록 모든 종속성 주입 프레임워크를 조정할 수 있습니다.

필수 조건

이 랩을 완료하려면 다음 항목이 있어야 합니다.

  • 용 Microsoft Visual Studio Express 2012 이상(설치 방법에 대한 지침은 부록 A를 참조하세요).

설정

코드 조각 설치

편의를 위해 이 랩을 따라 관리하는 대부분의 코드를 Visual Studio 코드 조각으로 사용할 수 있습니다. 코드 조각을 설치하려면 .\Source\Setup\CodeSnippets.vsi 파일을 실행합니다.

Visual Studio Code 코드 조각에 익숙하지 않고 사용하는 방법을 알아보려면 이 문서의 부록 "부록 B: 코드 조각 사용"을 참조할 수 있습니다.


연습

이 실습 랩은 다음 연습으로 구성됩니다.

  1. 연습 1: 컨트롤러 삽입
  2. 연습 2: 보기 삽입
  3. 연습 3: 필터 삽입

참고 항목

각 연습에는 연습을 완료한 후 가져와야 하는 결과 솔루션이 포함된 End 폴더가 함께 제공됩니다. 연습을 진행하는 데 추가적인 도움이 필요한 경우 이 솔루션을 가이드로 사용할 수 있습니다.

이 랩을 완료하는 데 소요되는 예상 시간: 30분

연습 1: 컨트롤러 삽입

이 연습에서는 NuGet 패키지를 사용하여 Unity를 통합하여 ASP.NET MVC 컨트롤러에서 종속성 주입을 사용하는 방법을 알아봅니다. 이러한 이유로 MvcMusicStore 컨트롤러에 서비스를 포함하여 논리를 데이터 액세스와 분리합니다. 서비스는 컨트롤러 생성자에 새 종속성을 만듭니다. 이 종속성은 Unity도움으로 종속성 주입을 사용하여 해결됩니다.

이 방법은 더 유연하고 유지 관리 및 테스트하기 쉬운 결합된 애플리케이션을 생성하는 방법을 보여 줍니다. 또한 ASP.NET MVC를 Unity와 통합하는 방법도 알아봅니다.

StoreManager 서비스 정보

시작 솔루션에 제공된 MVC Music Store에는 이제 StoreService라는 스토어 컨트롤러 데이터를 관리하는 서비스가 포함됩니다. 아래에서 Store Service 구현을 찾을 수 있습니다. 모든 메서드는 모델 엔터티를 반환합니다.

namespace MvcMusicStore.Controllers
{    
    using System.Web.Mvc;
    using MvcMusicStore.Filters;
    using MvcMusicStore.Services;

    [MyNewCustomActionFilter(Order = 1)]
    [CustomActionFilter(Order = 2)]
    public class StoreController : Controller
    {
        private IStoreService service;

        public StoreController(IStoreService service)
        {
            this.service = service;
        }

        // GET: /Store/
        public ActionResult Details(int id)
        {
            var album = this.service.GetAlbum(id);
            if (album == null)
            {
                return this.HttpNotFound();
            }

            return this.View(album);
        }

        public ActionResult Browse(string genre)
        {
            // Retrieve Genre and its Associated Albums from database
            var genreModel = this.service.GetGenreByName(genre);

            return this.View(genreModel);
        }

        public ActionResult Index()
        {
            var genres = this.service.GetGenres();

            return this.View(genres);
        }

        // GET: /Store/GenreMenu
        public ActionResult GenreMenu()
        {
            var genres = this.service.GetGenres();

            return this.PartialView(genres);
        }
    }
}

시작 솔루션의 StoreController는 이제 StoreService사용합니다. 모든 데이터 참조가 StoreController에서 제거되었으며 이제 StoreService를 사용하는 메서드를 변경하지 않고 현재 데이터 액세스 공급자를 수정할 수 있습니다.

아래에서 StoreController 구현이 클래스 생성자 내에서 StoreService종속성을 갖는 것을 확인할 수 있습니다.

참고 항목

이 연습에서 도입된 종속성은 IoC(Inversion of Control)와 관련이 있습니다.

StoreController 클래스 생성자는 클래스 내에서 서비스 호출을 수행하는 데 필수적인 IStoreService 형식 매개 변수를 받습니다. 그러나 StoreController 는 모든 컨트롤러가 ASP.NET MVC와 함께 작동해야 하는 기본 생성자(매개 변수 없음)를 구현하지 않습니다.

종속성을 해결하려면 추상 팩터리(지정된 형식의 개체를 반환하는 클래스)에서 컨트롤러를 만들어야 합니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcMusicStore.ViewModels;
using MvcMusicStore.Models;
using MvcMusicStore.Services;

namespace MvcMusicStore.Controllers
{
    public class StoreController : Controller
    {
        private IStoreService service;

        public StoreController(IStoreService service)
        {
            this.service = service;
        }

        //
        // GET: /Store/
        public ActionResult Index()
        {
            // Create list of genres
            var genres = this.service.GetGenreNames();

            // Create your view model
            var viewModel = new StoreIndexViewModel
            {
                Genres = genres.ToList(),
                NumberOfGenres = genres.Count()
            };

            return View(viewModel);
        }

        //
        // GET: /Store/Browse?genre=Disco
        public ActionResult Browse(string genre)
        {
            var genreModel = this.service.GetGenreByName(genre);

            var viewModel = new StoreBrowseViewModel()
            {
                Genre = genreModel,
                Albums = genreModel.Albums.ToList()
            };

            return View(viewModel);
        }

        //
        // GET: /Store/Details/5
        public ActionResult Details(int id)
        {
            var album = this.service.GetAlbum(id);

            return View(album);
        }
    }
}

참고 항목

선언된 매개 변수가 없는 생성자가 없으므로 클래스가 서비스 개체를 보내지 않고 StoreController를 만들려고 하면 오류가 발생합니다.

작업 1 - 애플리케이션 실행

이 작업에서는 애플리케이션 논리에서 데이터 액세스를 분리하는 저장소 컨트롤러에 서비스를 포함하는 Begin 애플리케이션을 실행합니다.

애플리케이션을 실행할 때 컨트롤러 서비스가 기본적으로 매개 변수로 전달되지 않으므로 예외가 발생합니다.

  1. Source\Ex01-Injecting Controller\Begin에 있는 Begin 솔루션을 엽니다.

    1. 계속하려면 몇 가지 누락된 NuGet 패키지를 다운로드해야 합니다. 이렇게 하려면 프로젝트 메뉴를 클릭하고 NuGet 패키지 관리를 선택합니다.

    2. NuGet 패키지 관리 대화 상자에서 복원을 클릭하여 누락된 패키지를 다운로드합니다.

    3. 마지막으로 빌드 솔루션 빌드를 클릭하여 솔루션을 빌드 | 합니다.

      참고 항목

      NuGet을 사용할 때의 이점 중 하나는 프로젝트의 모든 라이브러리를 배송할 필요가 없어 프로젝트 크기를 줄일 수 있다는 것입니다. NuGet Power Tools를 사용하면 Packages.config 파일에서 패키지 버전을 지정하면 프로젝트를 처음 실행할 때 필요한 모든 라이브러리를 다운로드할 수 있습니다. 이 때문에 이 랩에서 기존 솔루션을 연 후 이러한 단계를 실행해야 합니다.

  2. Ctrl+F5를 눌러 디버깅하지 않고 애플리케이션을 실행합니다. "이 개체에 대해 매개 변수가 없는 생성자가 정의되지 않았습니다."라는 오류 메시지가 표시됩니다.

    ASP.NET MVC Begin Application을 실행하는 동안 오류 발생

    ASP.NET MVC Begin Application을 실행하는 동안 오류 발생

  3. 브라우저를 닫습니다.

다음 단계에서는 Music Store 솔루션에서 이 컨트롤러에 필요한 종속성을 삽입합니다.

작업 2 - MvcMusicStore 솔루션에 Unity 포함

이 작업에서는 솔루션에 Unity.Mvc3 NuGet 패키지를 포함합니다.

참고 항목

Unity.Mvc3 패키지는 ASP.NET MVC 3용으로 설계되었지만 ASP.NET MVC 4와 완전히 호환됩니다.

Unity는 인스턴스 및 형식 가로채기에 대한 선택적 지원을 통해 확장 가능한 경량 종속성 주입 컨테이너입니다. 모든 유형의 .NET 애플리케이션에서 사용할 범용 컨테이너입니다. 이 기능은 종속성 주입 메커니즘에 있는 모든 일반적인 기능을 제공합니다. 여기에는 개체 생성, 런타임 시 종속성을 지정하여 요구 사항 추상화 및 컨테이너에 대한 구성 요소 구성을 지연하여 유연성이 있습니다.

  1. MvcMusicStore 프로젝트에 Unity.Mvc3 NuGet 패키지를 설치합니다. 이렇게 하려면 다른 창 보기 | 에서 패키지 관리자 콘솔을 엽니다.

  2. 다음 명령을 실행합니다.

    PMC

    Install-Package Unity.Mvc3
    

    Unity.Mvc3 NuGet 패키지 설치

    Unity.Mvc3 NuGet 패키지 설치

  3. Unity.Mvc3 패키지가 설치되면 Unity 구성을 간소화하기 위해 자동으로 추가되는 파일 및 폴더를 탐색합니다.

    Unity.Mvc3 패키지 설치됨

    Unity.Mvc3 패키지 설치됨

작업 3 - Global.asax.cs Application_Start Unity 등록

이 작업에서는 Global.asax.cs 있는 Application_Start 메서드를 업데이트하여 Unity 부트스트래퍼 이니셜라이저를 호출한 다음 종속성 주입에 사용할 서비스 및 컨트롤러를 등록하는 부트스트래퍼 파일을 업데이트합니다.

  1. 이제 Unity 컨테이너 및 종속성 확인자를 초기화하는 파일인 부트스트래퍼를 연결합니다. 이렇게 하려면 Global.asax.cs 열고 Application_Start 메서드 내에 강조 표시된 다음 코드를 추가합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex01 - Unity 초기화)

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    
        Bootstrapper.Initialise();
    
        AppConfig.Configure();
    }
    
  2. Bootstrapper.cs 파일을 엽니다.

  3. MvcMusicStore.Services 및 MusicStore.Controllers 네임스페이스를 포함합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex01 - 부트스트래퍼 네임스페이스 추가)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    
  4. BuildUnityContainer 메서드의 콘텐츠를 스토어 컨트롤러 및 Store Service를 등록하는 다음 코드로 바꿉니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex01 - 스토어 컨트롤러 및 서비스 등록)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        container.RegisterType<IStoreService, StoreService>();
        container.RegisterType<IController, StoreController>("Store");
    
        return container;
    }
    

작업 4 - 애플리케이션 실행

이 작업에서는 애플리케이션을 실행하여 Unity를 포함한 후 로드할 수 있는지 확인합니다.

  1. F5 키를 눌러 애플리케이션을 실행하면 애플리케이션이 오류 메시지를 표시하지 않고 로드됩니다.

    종속성 주입을 사용하여 애플리케이션 실행

    종속성 주입을 사용하여 애플리케이션 실행

  2. /Store로 찾습니다. 그러면 이제 Unity를 사용하여 만들어진 StoreController가 호출됩니다.

    MVC Music Store

    MVC Music Store

  3. 브라우저를 닫습니다.

다음 연습에서는 MVC 뷰 및 작업 필터를 ASP.NET 내에서 사용하도록 종속성 주입 범위를 확장하는 방법을 알아봅니다.

연습 2: 보기 삽입

이 연습에서는 Unity 통합을 위해 ASP.NET MVC 4의 새로운 기능을 사용하여 보기에서 종속성 주입을 사용하는 방법을 알아봅니다. 이를 위해 스토어 찾아보기 보기 내에서 사용자 지정 서비스를 호출합니다. 그러면 아래 메시지와 이미지가 표시됩니다.

그런 다음 프로젝트를 Unity와 통합하고 사용자 지정 종속성 확인자를 만들어 종속성을 삽입합니다.

작업 1 - 서비스를 사용하는 뷰 만들기

이 작업에서는 서비스 호출을 수행하여 새 종속성을 생성하는 뷰를 만듭니다. 이 서비스는 이 솔루션에 포함된 간단한 메시징 서비스로 구성됩니다.

  1. Source\Ex02-Injecting View\Begin 폴더에 있는 Begin 솔루션을 엽니다. 그렇지 않으면 이전 연습을 완료하여 얻은 끝 솔루션을 계속 사용할 수 있습니다.

    1. 제공 된 Begin 솔루션을 연 경우 계속하기 전에 누락된 NuGet 패키지를 다운로드해야 합니다. 이렇게 하려면 프로젝트 메뉴를 클릭하고 NuGet 패키지 관리를 선택합니다.

    2. NuGet 패키지 관리 대화 상자에서 복원을 클릭하여 누락된 패키지를 다운로드합니다.

    3. 마지막으로 빌드 솔루션 빌드를 클릭하여 솔루션을 빌드 | 합니다.

      참고 항목

      NuGet을 사용할 때의 이점 중 하나는 프로젝트의 모든 라이브러리를 배송할 필요가 없어 프로젝트 크기를 줄일 수 있다는 것입니다. NuGet Power Tools를 사용하면 Packages.config 파일에서 패키지 버전을 지정하면 프로젝트를 처음 실행할 때 필요한 모든 라이브러리를 다운로드할 수 있습니다. 이 때문에 이 랩에서 기존 솔루션을 연 후 이러한 단계를 실행해야 합니다.

      자세한 내용은 다음 문서를 https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages참조하세요.

  2. /Services의 원본 \Assets 폴더있는 MessageService.cs 및 IMessageService.cs 클래스를 포함합니다. 이렇게 하려면 Services 폴더를 마우스 오른쪽 단추로 클릭하고 기존 항목 추가를 선택합니다. 파일의 위치를 찾아서 포함합니다.

    메시지 서비스 및 서비스 인터페이스 추가

    메시지 서비스 및 서비스 인터페이스 추가

    참고 항목

    IMessageService 인터페이스는 MessageService 클래스에 의해 구현된 두 가지 속성을 정의합니다. 이러한 속성인 MessageImageUrl은 표시할 이미지의 메시지와 URL을 저장합니다.

  3. 프로젝트의 루트 폴더에 /Pages 폴더를 만든 다음 Source\Assets에서 기존 클래스 MyBasePage.cs 추가합니다. 상속할 기본 페이지에는 다음과 같은 구조가 있습니다.

    페이지 폴더

    namespace MvcMusicStore.Pages
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using Microsoft.Practices.Unity;
        using MvcMusicStore.Models;
        using MvcMusicStore.Services;
    
        public class MyBasePage : System.Web.Mvc.WebViewPage<Genre>
        {
            [Dependency]
            public IMessageService MessageService { get; set; }
    
            public override void 
    
            Execute()
            {
            }
        }
    }
    
  4. /Views/Store 폴더에서 Browse.cshtml 보기를 열고 MyBasePage.cs 상속합니다.

    @inherits MvcMusicStore.Pages.MyBasePage
    @{
         ViewBag.Title = "Browse Albums";
    }
    
  5. 찾아보기 보기에서 MessageService에 대한 호출을 추가하여 서비스에서 검색한 이미지와 메시지를 표시합니다. (C#)

    @inherits MvcMusicStore.Pages.MyBasePage    
    @{
        Viewbag.Title = "Browse Albums";
    }
    <div>
        @this.MessageService.Message
        <br />
        <img alt="@this.MessageService.Message" src="@this.MessageService.ImageUrl" />
    </div>
    ...
    

작업 2 - 사용자 지정 종속성 확인자 및 사용자 지정 보기 페이지 활성화기 포함

이전 작업에서는 뷰 내에 새 종속성을 삽입하여 내부 서비스 호출을 수행했습니다. 이제 ASP.NET MVC 종속성 주입 인터페이스 IViewPageActivatorIDependencyResolver를 구현하여 해당 종속성을 확인합니다. 솔루션에 Unity를 사용하여 서비스 검색을 처리하는 IDependencyResolver 구현을 포함합니다. 그런 다음 뷰 생성을 해결하는 IViewPageActivator 인터페이스의 또 다른 사용자 지정 구현을 포함합니다.

참고 항목

MVC 3에 ASP.NET 이후 종속성 주입 구현은 서비스를 등록하기 위한 인터페이스를 간소화했습니다. IDependencyResolverIViewPageActivator 는 종속성 주입을 위한 ASP.NET MVC 3 기능의 일부입니다.

- IDependencyResolver 인터페이스는 이전 IMvcServiceLocator를 대체합니다. IDependencyResolver의 구현자는 서비스 또는 서비스 컬렉션의 인스턴스를 반환해야 합니다.

public interface IDependencyResolver {
    object GetService(Type serviceType);
    IEnumerable<object> GetServices(Type serviceType);
}

- IViewPageActivator 인터페이스는 종속성 주입을 통해 보기 페이지를 인스턴스화하는 방법을 보다 세밀하게 제어합니다. IViewPageActivator 인터페이스를 구현하는 클래스는 컨텍스트 정보를 사용하여 뷰 인스턴스를 만들 수 있습니다.

public interface IViewPageActivator {
    object Create(ControllerContext controllerContext, Type type);
}
  1. 프로젝트의 루트 폴더에 /Factories 폴더를 만듭니다.

  2. /Sources/Assets/에서 Factories 폴더로 솔루션에 대한 CustomViewPageActivator.cs 포함합니다. 이렇게 하려면 /Factories 폴더를 마우스 오른쪽 단추로 클릭하고 추가 | 선택 기존 항목을 선택한 다음 CustomViewPageActivator.cs 선택합니다. 이 클래스는 Unity 컨테이너를 보유하는 IViewPageActivator 인터페이스를 구현합니다.

    namespace MvcMusicStore.Factories
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
        using Microsoft.Practices.Unity;
    
        public class CustomViewPageActivator : IViewPageActivator
        {
            private IUnityContainer container;
    
            public CustomViewPageActivator(IUnityContainer container)
            {
                this.container = container;
            }
    
            public object Create(ControllerContext controllerContext, Type type)
            {
                return this.container.Resolve(type);
            }
        }
    }
    

    참고 항목

    CustomViewPageActivator 는 Unity 컨테이너를 사용하여 뷰 만들기를 관리합니다.

  3. /Sources/Assets에서 /Factories 폴더로 UnityDependencyResolver.cs 파일을 포함합니다. 이렇게 하려면 /Factories 폴더를 마우스 오른쪽 단추로 클릭하고 추가 | 선택 기존 항목을 선택한 다음 UnityDependencyResolver.cs 파일을 선택합니다.

    namespace MvcMusicStore.Factories
    {
         using System;
         using System.Collections.Generic;
         using System.Linq;
         using System.Web;
         using System.Web.Mvc;
         using Microsoft.Practices.Unity;
    
         public class UnityDependencyResolver : IDependencyResolver
         {
              private IUnityContainer container;
    
              private IDependencyResolver resolver;
    
              public UnityDependencyResolver(IUnityContainer container, IDependencyResolver resolver)
              {
                    this.container = container;
                    this.resolver = resolver;
              }
    
              public object GetService(Type serviceType)
              {
                    try
                    {
                         return this.container.Resolve(serviceType);
                    }
                    catch
                    {
                         return this.resolver.GetService(serviceType);
                    }
              }
    
              public IEnumerable<object> GetServices(Type serviceType)
              {
                    try
                    {
                         return this.container.ResolveAll(serviceType);
                    }
                    catch
                    {
                         return this.resolver.GetServices(serviceType);
                    }
              }
         }
    }
    

    참고 항목

    UnityDependencyResolver 클래스는 Unity용 사용자 지정 DependencyResolver입니다. Unity 컨테이너 내에서 서비스를 찾을 수 없는 경우 기본 확인자를 호출합니다.

다음 작업에서는 두 구현이 모두 등록되어 모델에서 서비스의 위치와 뷰를 알 수 있도록 합니다.

작업 3 - Unity 컨테이너 내에서 종속성 주입 등록

이 작업에서는 종속성 주입이 작동하도록 모든 이전 항목을 함께 배치합니다.

지금까지 솔루션에는 다음과 같은 요소가 있습니다.

  • MyBaseClass에서 상속되고 MessageService사용하는 찾아보기 보기입니다.
  • 서비스 인터페이스에 대해 종속성 주입이 선언된 중간 클래스 -MyBaseClass입니다.
  • 서비스 - MessageService 및 해당 인터페이스 IMessageService.
  • 서비스 검색을 처리하는 Unity- UnityDependencyResolver 에 대한 사용자 지정 종속성 확인자입니다.
  • 페이지를 만드는 View Page activator - CustomViewPageActivator 입니다.

찾아보기 보기를 삽입하려면 이제 Unity 컨테이너에 사용자 지정 종속성 확인자를 등록합니다.

  1. Bootstrapper.cs 파일을 엽니다.

  2. MessageService 인스턴스를 Unity 컨테이너에 등록하여 서비스를 초기화합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex02 - 메시지 서비스 등록)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        container.RegisterType<IStoreService, StoreService>();
        container.RegisterType<IController, StoreController>("Store");
    
        container.RegisterInstance<IMessageService>(new MessageService
        {
            Message = "You are welcome to our Web Camps Training Kit!",
            ImageUrl = "/Content/Images/webcamps.png"
        });
        //...
    }
    
  3. MvcMusicStore.Factories 네임스페이스에 대한 참조를 추가합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex02 - 팩터리 네임스페이스)

    using System.Web.Mvc; 
    using Microsoft.Practices.Unity; 
    using Unity.Mvc3; 
    using MvcMusicStore.Services; 
    using MvcMusicStore.Controllers; 
    using MvcMusicStore.Factories;
    
  4. CustomViewPageActivator를 보기 페이지 활성화자로 Unity 컨테이너에 등록합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex02 - CustomViewPageActivator 등록)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        container.RegisterType<IStoreService, StoreService>();
        container.RegisterType<IController, StoreController>("Store");
    
        container.RegisterInstance<IMessageService>(new MessageService
        {
            Message = "You are welcome to our Web Camps Training Kit!",
            ImageUrl = "/Content/Images/webcamps.png"
        });
    
        container.RegisterType<IViewPageActivator, CustomViewPageActivator>(new InjectionConstructor(container));
    
        return container;
    }
    
  5. ASP.NET MVC 4 기본 종속성 확인자를 UnityDependencyResolver 인스턴스로 대체합니다. 이렇게 하려면 Initialize 메서드 콘텐츠를 다음 코드로 바꿉다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex02 - 종속성 해결 프로그램 업데이트)

    public static void Initialise()
    {
        var container = BuildUnityContainer();
    
        DependencyResolver.SetResolver(new Unity.Mvc3.UnityDependencyResolver(container));
    
        IDependencyResolver resolver = DependencyResolver.Current;
    
        IDependencyResolver newResolver = new Factories.UnityDependencyResolver(container, resolver);
    
        DependencyResolver.SetResolver(newResolver);
    }
    

    참고 항목

    ASP.NET MVC는 기본 종속성 확인자 클래스를 제공합니다. 통합을 위해 만든 사용자 지정 종속성 확인자를 사용하려면 이 해결 프로그램을 바꿔야 합니다.

작업 4 - 애플리케이션 실행

이 작업에서는 애플리케이션을 실행하여 스토어 브라우저가 서비스를 사용하고 검색된 이미지와 메시지를 표시하는지 확인합니다.

  1. F5 키를 눌러 애플리케이션을 실행합니다.

  2. 장르 메뉴 내에서 Rock을 클릭하고 MessageService보기에 삽입되고 환영 메시지와 이미지를 로드하는 방법을 확인합니다. 이 예제에서는 "Rock"을 입력합니다.

    MVC Music Store - 보기 삽입

    MVC Music Store - 보기 삽입

  3. 브라우저를 닫습니다.

연습 3: 작업 필터 삽입

이전 실습 랩 사용자 지정 작업 필터 에서 필터 사용자 지정 및 삽입 작업을 수행했습니다. 이 연습에서는 Unity 컨테이너를 사용하여 종속성 주입을 사용하여 필터를 삽입하는 방법을 알아봅니다. 이렇게 하려면 사이트의 활동을 추적하는 사용자 지정 작업 필터를 Music Store 솔루션에 추가합니다.

작업 1 - 솔루션에 추적 필터 포함

이 작업에서는 음악 저장소에 이벤트를 추적하는 사용자 지정 작업 필터를 포함합니다. 사용자 지정 작업 필터 개념은 이전 랩 "사용자 지정 작업 필터"에서 이미 처리되므로 이 랩의 Assets 폴더에서 필터 클래스를 포함하고 Unity용 필터 공급자를 만듭니다.

  1. Source\Ex03 - 삽입 작업 필터\Begin 폴더에 있는 Begin 솔루션을 엽니다. 그렇지 않으면 이전 연습을 완료하여 얻은 끝 솔루션을 계속 사용할 수 있습니다.

    1. 제공 된 Begin 솔루션을 연 경우 계속하기 전에 누락된 NuGet 패키지를 다운로드해야 합니다. 이렇게 하려면 프로젝트 메뉴를 클릭하고 NuGet 패키지 관리를 선택합니다.

    2. NuGet 패키지 관리 대화 상자에서 복원을 클릭하여 누락된 패키지를 다운로드합니다.

    3. 마지막으로 빌드 솔루션 빌드를 클릭하여 솔루션을 빌드 | 합니다.

      참고 항목

      NuGet을 사용할 때의 이점 중 하나는 프로젝트의 모든 라이브러리를 배송할 필요가 없어 프로젝트 크기를 줄일 수 있다는 것입니다. NuGet Power Tools를 사용하면 Packages.config 파일에서 패키지 버전을 지정하면 프로젝트를 처음 실행할 때 필요한 모든 라이브러리를 다운로드할 수 있습니다. 이 때문에 이 랩에서 기존 솔루션을 연 후 이러한 단계를 실행해야 합니다.

      자세한 내용은 다음 문서를 https://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages참조하세요.

  2. /Sources/Assets에서 /Filters 폴더로 TraceActionFilter.cs 파일을 포함합니다.

    namespace MvcMusicStore.Filters
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
    
        public class TraceActionFilter : IActionFilter
        {
            public void OnActionExecuted(ActionExecutedContext filterContext)
            {
                filterContext.HttpContext.Trace.Write("OnActionExecuted");
                filterContext.HttpContext.Trace.Write("Action " + filterContext.ActionDescriptor.ActionName);
                filterContext.HttpContext.Trace.Write("Controller " + filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
            }
    
            public void OnActionExecuting(ActionExecutingContext filterContext)
            {
                filterContext.HttpContext.Trace.Write("OnActionExecuting");
                filterContext.HttpContext.Trace.Write("Action " + filterContext.ActionDescriptor.ActionName);
                filterContext.HttpContext.Trace.Write("Controller " + filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
            }
        }
    }
    

    참고 항목

    이 사용자 지정 작업 필터는 ASP.NET 추적을 수행합니다. 자세한 참조는 "ASP.NET MVC 4 로컬 및 동적 작업 필터" 랩을 확인할 수 있습니다.

  3. /Filters 폴더의 프로젝트에 빈 클래스 FilterProvider.cs 추가합니다.

  4. FilterProvider.cs System.Web.MvcMicrosoft.Practices.Unity 네임스페이스를 추가합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex03 - 필터 공급자 네임스페이스 추가)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    
    namespace MvcMusicStore.Filters
    {
         public class FilterProvider
         {
         }
    }
    
  5. IFilterProvider 인터페이스에서 클래스를 상속합니다.

    namespace MvcMusicStore.Filters
    {
        public class FilterProvider : IFilterProvider
        {
        }
    }
    
  6. FilterProvider 클래스에 IUnityContainer 속성을 추가한 다음 컨테이너를 할당할 클래스 생성자를 만듭니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex03 - 필터 공급자 생성자)

    public class FilterProvider : IFilterProvider
    {
        private IUnityContainer container;
    
        public FilterProvider(IUnityContainer container)
        {
            this.container = container;
        }
    }
    

    참고 항목

    필터 공급자 클래스 생성자가 내부에 새 개체를 만들지 않습니다. 컨테이너는 매개 변수로 전달되고 종속성은 Unity에서 해결됩니다.

  7. FilterProvider 클래스에서 IFilterProvider 인터페이스에서 GetFilters 메서드를 구현합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex03 - 필터 공급자 GetFilters)

    public class FilterProvider : IFilterProvider
    {
        private IUnityContainer container;
    
        public FilterProvider(IUnityContainer container)
        {
            this.container = container;
        }
    
        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            foreach (IActionFilter actionFilter in this.container.ResolveAll<IActionFilter>())
            {
                yield return new Filter(actionFilter, FilterScope.First, null);
            }
        }
    }
    

작업 2 - 필터 등록 및 사용

이 작업에서는 사이트 추적을 사용하도록 설정합니다. 이렇게 하려면 Bootstrapper.cs BuildUnityContainer 메서드에 필터를 등록하여 추적을 시작합니다.

  1. 프로젝트 루트에 있는 Web.config를 열고 System.Web 그룹에서 추적 추적을 사용하도록 설정합니다.

    <system.web>
        <trace enabled="true"/>
        <compilation debug="true" targetFramework="4.5">
    
  2. 프로젝트 루트에서 Bootstrapper.cs 엽니다.

  3. MvcMusicStore.Filters 네임스페이스에 대한 참조 를 추가합니다 .

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex03 - 부트스트래퍼 네임스페이스 추가)

    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Unity.Mvc3;
    using MvcMusicStore.Services;
    using MvcMusicStore.Controllers;
    using MvcMusicStore.Factories;
    using MvcMusicStore.Filters;
    
  4. BuildUnityContainer 메서드를 선택하고 Unity 컨테이너에 필터를 등록합니다. 필터 공급자와 작업 필터를 등록해야 합니다.

    (코드 조각 - ASP.NET 종속성 주입 랩 - Ex03 - Register FilterProvider 및 ActionFilter)

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
    
        //...
    
        container.RegisterInstance<IFilterProvider>("FilterProvider", new FilterProvider(container));
        container.RegisterInstance<IActionFilter>("LogActionFilter", new TraceActionFilter());
    
        return container;
    }
    

작업 3 - 애플리케이션 실행

이 작업에서는 애플리케이션을 실행하고 사용자 지정 작업 필터가 활동을 추적하고 있는지 테스트합니다.

  1. F5 키를 눌러 애플리케이션을 실행합니다.

  2. 장르 메뉴 내에서 바위를 클릭합니다. 원하는 경우 더 많은 장르를 찾아볼 수 있습니다.

    Music Store

    Music Store

  3. /Trace.axd로 이동하여 애플리케이션 추적 페이지를 확인한 다음 세부 정보 보기를 클릭합니다.

    애플리케이션 추적 로그

    애플리케이션 추적 로그

    애플리케이션 추적 - 요청 세부 정보

    애플리케이션 추적 - 요청 세부 정보

  4. 브라우저를 닫습니다.


요약

이 실습 랩을 완료하면 NuGet 패키지를 사용하여 Unity를 통합하여 ASP.NET MVC 4에서 종속성 주입을 사용하는 방법을 알아보았습니다. 이를 위해 컨트롤러, 뷰 및 작업 필터 내에서 종속성 주입을 사용했습니다.

다음 개념을 다루었습니다.

  • MVC 4 종속성 주입 기능 ASP.NET
  • Unity.Mvc3 NuGet 패키지를 사용한 Unity 통합
  • 컨트롤러의 종속성 주입
  • 뷰의 종속성 주입
  • 작업 필터의 종속성 주입

부록 A: Visual Studio Express 2012 for Web 설치

Microsoft 웹 플랫폼 설치 관리자 사용하여 웹용 Microsoft Visual Studio Express 2012 또는 다른 "Express" 버전을 설치수 있습니다. 다음 지침은 Microsoft 웹 플랫폼 설치 관리자 사용하여 Visual Studio Express 2012 for Web을 설치하는 데 필요한 단계를 안내합니다.

  1. /iis/extensions/introduction-to-iis-express/iis-express-overview?linkid=9810169. 또는 웹 플랫폼 설치 관리자를 이미 설치한 경우 해당 설치 관리자를 열고 "Visual Studio Express 2012 for Web with Windows Azure SDK" 제품을 검색할 수 있습니다.

  2. 지금 설치를 클릭합니다. 웹 플랫폼 설치 관리자없는 경우 먼저 다운로드하여 설치하도록 리디렉션됩니다.

  3. 웹 플랫폼 설치 관리자가 열리면 설치를 클릭하여 설치를 시작합니다.

    Visual Studio Express 설치

    Visual Studio Express 설치

  4. 모든 제품의 라이선스 및 사용 약관을 읽고 동의를 클릭하여 계속합니다.

    사용 조건 동의

    사용 조건 동의

  5. 다운로드 및 설치 프로세스가 완료될 때까지 기다립니다.

    설치 진행률

    설치 진행률

  6. 설치가 완료되면 마침을 클릭합니다.

    설치 완료

    설치 완료

  7. 종료를 클릭하여 웹 플랫폼 설치 관리자를 닫습니다.

  8. Visual Studio Express for Web을 열려면 시작 화면으로 이동하여 "VS Express" 쓰기를 시작한 다음 VS Express for Web 타일을 클릭합니다.

    VS Express for Web 타일

    VS Express for Web 타일

부록 B: 코드 조각 사용

코드 조각을 사용하면 필요한 모든 코드를 손쉽게 사용할 수 있습니다. 랩 문서에서는 다음 그림과 같이 언제 사용할 수 있는지 정확하게 알려줍니다.

Visual Studio 코드 조각을 사용하여 프로젝트에 코드 삽입

Visual Studio 코드 조각을 사용하여 프로젝트에 코드 삽입

키보드를 사용하여 코드 조각을 추가하려면(C#에만 해당)

  1. 코드를 삽입할 위치에 커서를 놓습니다.
  2. 공백이나 하이픈 없이 코드 조각 이름 입력을 시작합니다.
  3. IntelliSense가 일치하는 코드 조각의 이름을 표시하는 것을 확인합니다.
  4. 올바른 코드 조각을 선택하거나 전체 코드 조각의 이름이 선택될 때까지 계속 입력합니다.
  5. Tab 키를 두 번 눌러 커서 위치에 코드 조각을 삽입합니다.

코드 조각 이름 입력 시작

코드 조각 이름 입력 시작

Tab 키를 눌러 강조 표시된 코드 조각을 선택합니다.

Tab 키를 눌러 강조 표시된 코드 조각을 선택합니다.

Tab 키를 다시 누르면 코드 조각이 확장됩니다.

Tab 키를 다시 누르면 코드 조각이 확장됩니다.

마우스(C#, Visual Basic 및 XML) 1을 사용하여 코드 조각을 추가합니다. 코드 조각을 삽입할 위치를 마우스 오른쪽 단추로 클릭합니다.

  1. 코드 조각 삽입, 내 코드 조각 삽입을 선택합니다.
  2. 목록에서 관련 코드 조각을 클릭하여 선택합니다.

코드 조각을 삽입할 위치를 마우스 오른쪽 단추로 클릭하고 코드 조각 삽입을 선택합니다.

코드 조각을 삽입할 위치를 마우스 오른쪽 단추로 클릭하고 코드 조각 삽입을 선택합니다.

목록에서 관련 코드 조각을 클릭하여 선택합니다.

목록에서 관련 코드 조각을 클릭하여 선택합니다.