[ASP.NET MVC] DI 컨테이너 설정(Ninject)
지난번 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); } |
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 |