[ASP.NET MVC] DI 컨테이너 설정(Ninject)

Posted by 알 수 없는 사용자
2015. 9. 13. 17:17 프로그래밍/.NET

지난번 Ninject 사용에서는 응용프로그램에 대해 적용하는 방법을 알아보았는데

이번에는 레스토랑의 메뉴리스트를 보여주는 시나리오를 통해 ASP.NET MVC에서 DI를 어떻게 적용하는지 알아보자.


1. NinjectController 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class NinjectController : DefaultControllerFactory
{
    private IKernel ninjectKernel;
 
    public NinjectController()
    {
        ninjectKernel = new StandardKernel();
        this.AddBindings();
    }
 
    protected override IController GetControllerInstance(RequestContext request, Type type)
    {
        return type == null ? null : (IController)ninjectKernel.Get(type);
    }
 
    private void AddBindings()
    {
    }
}

[코드1]

Ninject를 이용해 의존성 주입을 하기 위한 NinjectController 클래스를 생성한다.

의존성주입이 필요하다면 줄 Addbindings()함수에 추가하면 된다.


2. NinjectController 등록

1
2
3
4
5
6
7
8
9
10
11
protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
 
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
 
    ControllerBuilder.Current.SetControllerFactory(new NinjectController());
}

[코드2]

[코드2]의 10번째 줄은 [코드1]에서 생성한 클래스를 사용한다고 ASP.NET MVC에 알리는 과정이다.


3. 도메인 모델 생성

1
2
3
4
5
6
7
8
public class Menu
{
    public string MenuID { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public string Category { get; set; }
}

[코드3]

1
2
3
4
public interface IMenuRepository
{
    IQueryable<Menu> Menus { get; }
}

[코드4]

메뉴리스트에서 메뉴정보를 갖는 Menu클래스를 정의하고 Repository를 추가한다.


3. 데이터바인딩

1
2
3
4
5
6
7
8
9
private void AddBindings()
{
    Mock<IMenuRepository> mock = new Mock<IMenuRepository>();
    mock.Setup(m => m.Menus).Returns(new List<Menu>{
        new Menu{ MenuID = Guid.NewGuid().ToString(), Name = "Calamari", Price = 18, Category = "Side"}
        , new Menu{ MenuID = Guid.NewGuid().ToString(), Name = "Lamb", Price = 36, Category = "Main"}
    }.AsQueryable());
    ninjectKernel.Bind<IMenuRepository>().ToConstant(mock.Object);
}
[코드5]
원래라면 DB에서 데이터를 불러와서 메뉴정보에 담는 과정이 필요한데 여기서는 DB사용하지 않으므로
임시 데이처를 추가한다.
데이터바인딩작업은 위의 [코드1]에서 만든 NinjectController 클래스의 AddBinding() 함수에서 한다.

4. 메뉴 컨트롤러 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MenuController : Controller
{
    private IMenuRepository _iMenuRepository;
 
    public MenuController(IMenuRepository menuRepository)
    {
        _iMenuRepository = menuRepository;
    }
 
    public ActionResult List()
    {
        return View(_iMenuRepository.Menus);
    }
}

[코드6]

메뉴목록을 보여주기 위해 MenuController 클래스에 List함수를 추가했다.


5. 메뉴 리스트 뷰 생성

1
2
3
4
5
6
<h2>Menu List</h2>
 
@foreach (var menu in Model){
    <h2>@menu.Name</h2>
    <h4>@menu.Price</h4>
}

[코드7]

메뉴리스트 뷰생성은 [코드6]의 List함수에서 마우스 오른쪽 클릭 -> 뷰 추가 버튼을 클릭하여 생성한다.

뷰생성시 강력한 형식의 뷰를 선택하여 [코드3]에서 생성한 메뉴클래스를 입력한다.


6. 결과 확인 하기



[그림1]

코드작성이 완료되었으면 빌드하여 결과를 확인한다.



'프로그래밍 > .NET' 카테고리의 다른 글

[ASP.NET MVC]Ninject 사용법  (748) 2015.08.23
[ASP.NET MVC]Dependency Injection 개념  (1309) 2015.08.02
[ASP.NET MVC] Controller에서 데이터 전달  (4) 2015.07.11
[ASP.NET MVC] Project 생성, MVC Hello World!  (4) 2015.06.26
<ASP.NET> Razor  (5) 2015.05.18