1

내가 설정 유니티 내 MVC 응용 프로그램의 Bootstrapper.cs에, 모두가 내가있을 때unity.mvc4 : 참조를 얻는 방법

내 질문은 ... 내 컨트롤러에서 생성자 주입을 위해 잘 작동했습니다 컨트롤러 내의 ActionResult에서 이전에 Bootstrapper.cs에서 작성한 컨테이너에 대한 참조를 가져와 클래스를 해결할 수 있도록해야합니다.

예컨대 :

public ActionResult Index() 
{ 
    //-- container needs a reference to unity container 
    var testService = container.Resolve<ITestService>(); 
    return View(testService); 
} 

답변

1

내가 용기

아니 그렇게하지에 대한 참조를 얻을 필요가있다. 귀하의 신청서 내에서 should never need to reference the container (또는 DependencyResolver) 대신

사용 생성자 주입 :

public class HomeController : Controller 
{ 
    private readonly ITestService testService; 

    // constructor 
    public HomeController(ITestService testService) 
    { 
     this.testService = testService; 
    } 

    public ActionResult Index() 
    { 
     return View(this.testService); 
    } 
} 

당신이 단결의 MVC3 통합 패키지를 사용하고 있기 때문에, 당신은 아마 당신의 응용 프로그램의 시작 경로에 DependencyResolver 유니티 특정 등록. 즉 많은 다음과 같습니다

DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

당신은 유니티 컨테이너에 컨트롤러의 생성을 위임합니다, 사용자 정의 DependencyResolver을 이런 짓을했는데 유니티 컨테이너가 생성자의 컨트롤러의의 depdencies을 주입 할 경우.

당신이 절대해서는 안되는 일은보기가 어떤 작업을하고 서비스에 종속되도록하는 것입니다. 뷰는 멍청해야하며 컨트롤러에서 가져온 데이터를 매핑하고 HTML (또는 JSON 등)으로 변환하는 것 이상을 수행하면 안됩니다.

즉, testService을보기로 전달하지 마십시오. 보기 내에서 testService을 호출하면 해당 논리가 숨기고보기가 더 복잡해지며 시스템을 테스트하기가 어려워집니다. ITestService 추상화를 사용하고 있기 때문에 코드를 테스트 할 수 있기를 원하지만 뷰 테스트는 쉽지 않습니다 (적어도 컨트롤러를 테스트 할 수있는만큼 쉽지는 않습니다).

컨트롤러가 testService을 호출하고 뷰를 사용하는 데 필요한 데이터를 수집하게해야합니다. 해당 데이터를 단일 클래스, 뷰 모델로 결합하여보기에 전달하는 것보다 빠릅니다.

관련 문제