0

처음 IoC를 배우지 만 표준 ASP.NET MVC 컨트롤러에서 뷰 모델 및 모델 바인딩과 함께 작동하는 방법을 알아낼 수 없습니다. 필자는 단단히 결합 된 저장소와 뷰 모델을 사용하는 기본 컨트롤러를 가지고 있다고 가정 해 보겠습니다.ASP.NET MVC에서 viewmodel을 사용하는 DI

public class Sample 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     var repo = new SampleRepository(); 
     var model = new SampleViewModel(); 
     model.SampleItems = repo.Get(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SampleViewModel model) 
    { 
     ... 
    } 
} 

지금 나는 종속 클래스를의에서 내가 저장소를 주입 할 수 있도록 DI 느슨하게 커플이 컨트롤러를 사용하여 생성자 주입을 통해 내 문제가

public class Sample 
{ 
    private readonly ISampleRepository _sampleRepository; 
    private readonly ISampleViewModel _sampleViewModel; 

    public Sample(
      ISampleRepository sampleRepository, 
      ISampleViewModel sampleViewModel) 
    { 
     _sampleRepository = sampleRepository; 
     _sampleViewModel = sampleViewModel; 
    } 

    [HttpGet] 
    public ActionResult Index() 
    { 
     _sampleViewModel.SampleItems = _sampleRepository.Get() 

     return View(_sampleViewModel); 
    } 

    [HttpPost] 
    public ActionResult Index(SampleViewModel model) 
    { 
     ... 
    } 
} 

, 내가 지금 주입하고 있습니다을에서의 ViewModel 할 HttpPost Action은 모델 바인딩을 수행하기 위해 구체적인 SampleViewModel을 필요로합니까?

내가 어떻게 작동하는지 오해 했습니까? 컨트롤러에서 뷰 모델을 느슨하게 결합해야합니까? 아니면 모델 바인더가 제대로 작동하려면 꼭 필요한 커플 링입니까? 사람들이 컨트롤러에 뷰 모델을 반환하기 위해 서비스 레이어를 사용하는 코드를 보았습니다. 또한 사용자 정의 모델 바인더를 작성할 수도 있다는 것을 알고 있습니다. 그러나 여기에서 내가하고 싶은 것에 대한 막대한 과잉 짜증처럼 보입니다. 내가 한 것은 GET 및 POST 뷰를 통해 사용할 수있는 기본 뷰 모델에 주입하는 방법입니다.

+0

model-view-controller 태그는 패턴에 대한 질문입니다. ASP.NET-MVC 구현을위한 특정 태그가 있습니다. –

+1

왜 뷰 모델을 주입하고 있습니까 (모델이 아닌 서비스를 주입합니까)? –

+0

태깅 첫 번째 게시물에 대한 사과 : ( – JoshRees

답변

3

보기 모델이 실제로는 않습니다. 아무것도. 기본적으로 컨트롤러에서보기로 데이터를 전송하는 DTO입니다. 정의에 따르면 어떤 종속성도 가질 수 없습니다. 대신 응용 프로그램의 런타임 상태의 일부입니다.

Injecting runtime data is anti-pattern. 대신 항상 반환 할 것으로 예상되므로 컨트롤러가 viewmodel의 인스턴스를 만들어야합니다. 테스트를 위해 조롱 할 이유가 없으며 구현을 대체 할 이유가 없습니다. 따라서 추상화 (인터페이스 또는 추상 클래스) 할 이유가 없습니다.

public class Sample 
{ 
    private readonly ISampleRepository _sampleRepository; 

    public Sample(
      ISampleRepository sampleRepository) 
    { 
     _sampleRepository = sampleRepository; 
    } 

    [HttpGet] 
    public ActionResult Index() 
    { 
     var sampleViewModel = new SampleViewModel() 
     { 
      SampleItems = _sampleRepository.Get(), 
      // Other initialization here... 
     }; 

     return View(sampleViewModel); 
    } 

    [HttpPost] 
    public ActionResult Index(SampleViewModel model) 
    { 
     ... 
    } 
} 
+0

아 좋아요. 내 viewmodel 그냥 데이터 컨테이너입니다. 필드와 컬렉션으로 만 구성되며 컨트롤러로 채워집니다. 내가 ioc 초보자이기 때문에, 내가 생각한 속임수는 컨트롤러가 뷰 모델에 종속되어 있다고 생각합니다. DI 구현은 다른 클래스를 수동으로 새로 만들지 않는다고 생각했습니다. 왜냐하면 viewmodel은 DTO 일 뿐이므로 테스트/조롱은 필요 없으며 viewmodel은 모델 바인딩을 통해 뷰에 밀접하게 연결되어 있기 때문에 괜찮습니다. 내 컨트롤러에서 구체적인 뷰 모델을 새로 만드시겠습니까? – JoshRees

+0

@JoshRees 예, 맞습니다. DI를 사용한다고해서 결코 새 키워드를 사용하여 객체를 다시 인스턴스화하지는 않습니다.모든 것과 마찬가지로 의미가있는 곳에서만 DI를 사용하십시오. –

+0

건배 마틴. 정확히 내가 찾고 있던 정보. – JoshRees

관련 문제