본문 바로가기

사이드 프로젝트/SportsStore (ASP.NET MVC5)

[ASP.NET Project] DI 컨테이너 설정하기

DependencyResolver 설정


우선, DI 컨테이너를 연결하기 위해 DependencyResolver를 설정해야 한다. 이를 위해 프로젝트에 DependencyResolver.cs라는 파일을 생성하자.

namespace SportsStore.WebUI.Infrastructure
{
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;

        public NinjectDependencyResolver(IKernel kernel)
        {
            this.kernel = kernel;
            AddBindings();
        }   

        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }

        private void AddBindings() { 
            // 바인딩 정보 입력
        }
    }
}

 

 

Domain 모델 정의

예를 들어, SportsStore.Domain.Entities 네임스페이스 안에 Product 클래스를 추가했다고 가정해보자. 이 클래스는 다음과 같은 속성을 가진다:

namespace SportsStore.Domain.Entities
{
    public class Product
    {
        public int ProductID { get; set; }
        public string Name { get; set;}
        public string Description { get; set;}
        public decimal Price { get; set;}
        public string Category { get; set; }
    }
}

 

DI 컨테이너 등록


.NET MVC에서 Ninject와 같은 DI 컨테이너를 사용하여 의존성 해결자를 설정할 수 있다. Ninject를 사용하는 경우, App_Start 폴더의 NinjectWebCommon.cs 파일을 수정해야 한다.

NinjectWebCommon.cs 수정

다음은 의존성 등록을 위해 NinjectWebCommon.cs 파일의 하단을 수정하는 코드이다:

private static void RegisterServices(IKernel kernel)
{
    // MVC 프레임워크와 DI 컨테이너를 연결
    System.Web.Mvc.DependencyResolver.SetResolver(
        new SportsStore.WebUI.Infrastructure.NinjectDependencyResolver(kernel));
}

 

위 코드는 SportsStore.WebUI.Infrastructure.NinjectDependencyResolver를 통해 MVC 프레임워크와 DI 컨테이너 간의 연결 고리를 구성한다. 이렇게 하면 컨트롤러와 같은 MVC 구성 요소에 필요한 의존성을 DI 컨테이너에서 자동으로 주입할 수 있다.

 

의존성 주입 설정 완료


이제 MVC 프레임워크와 DI 컨테이너 간의 연결이 완료되었다. 이를 통해 MVC 컨트롤러 또는 다른 클래스에 필요한 개체를 자동으로 주입받을 수 있다. 예를 들어, ProductController에서 ProductRepository를 주입받는 구조로 변경하면 코드가 더욱 깔끔해진다.

 

추가 팁


  • Ninject 외에 다른 DI 컨테이너(예: Autofac, Unity)를 사용하는 경우에도 비슷한 방식으로 설정할 수 있다.
  • 의존성 주입을 사용하면 코드의 유지보수성과 확장성이 크게 향상된다. 앞으로 컨트롤러의 의존성을 생성자 주입 방식으로 리팩토링하는 것도 추천한다.