답변

9

브래드 윌슨 http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

전망이 완전히 정확하지 생성자 주입을 허용 다른 사람의 진술에 의해 블로그 포스트에서보기 분사에 대한 expample 있습니다. 예 IDependencyResolver을 사용하면 생성자 인수가있는 뷰를 만들 수 있습니다. 그러나 자신의 뷰 엔진을 구현하지 않는다면 전혀 도움이되지 않을 것입니다. 면도기 같은 기존 뷰 엔진에는 매개 변수없는 생성자가 필요합니다. 즉, 뷰를 통해 속성 삽입 만 수행 할 수 있습니다.

그러나 다른 사람들은 당신이보기 주사를해서는 안된다고 말했기 때문에. 뷰는 멍청한 상태 여야하며 뷰 모델을 HTML로 렌더링하면됩니다. 종속성이 필요한 모든 것은 컨트롤러 또는 서비스에서 수행되어야합니다.

+0

보기의 속성으로 사용할 수있는 사용자 지정 권한이 있으면 어떻게됩니까? (필요한 권한없이 면도기에서 렌더링해서는 안되는 특정 부분을 지정) –

4

예, 가능하지만 실제로는 좋지 않다고 생각합니다. 왜 뷰 수준에서 "서비스"가 필요합니까? 주요 MVC 지침 - 보기가 바보 같아야한다는 것을 기억하십시오. 실제로 뷰 모델 객체를 HTML로 변환하는 템플릿 일뿐입니다.

+0

좋은 지적. 그는 '관제사'에 서비스를 주입해야한다. – Steven

+5

뷰 내의 i18n 번역. 보기에는 키가 포함되어 있으며 올바른 번역을 간단히 가져옵니다. 그 이유가 그 견해에 있지 않을 이유가 없습니다. – BradLaney

+2

텍스트 만 포함하는 현지화 또는 구성 유형 서비스는 어떻게됩니까? 그들은 기술적으로 여전히 바보입니다. –

7

생성자 주입을 수행 할 수 없습니다. 하지만 당신은 Ninject에, 말하자면,이 같은 것을 수행 할 수 있습니다

 
    public abstract class CustomViewBase<TModel> : WebViewPage<TModel> where TModel : class 
    { 
     [Inject] 
     public IFace Face 
     { 
      get; 
      set; 
     } 
    } 

을 그리고 당신은 당신이 제대로 초기화 @Face 속성을 가지고 있어야의 Global.asax에 IDependencyResolver을 설정 한 가정 할. 그러나 중요한주의 사항 : 레이아웃 페이지에서 레이아웃에 액세스하려고하면 (Brad Wilson에 따르면) 레이아웃이 MVC 외부에서 작동하고 @Face가 null이되므로 _Layout.cshtml에서 @Face에 액세스하지 못할 수 있습니다.

어떤 경우 든 복잡한 논리를 다룰 필요가 없다는 점에서 다른 사람들과 동의합니다.

+1

이것은 굉장합니다! Ninject로 그 일을 할 수 있다는 것을 몰랐습니다. –

+0

Ninject 일 필요는 없습니다. Autofac과 다른 사람들은 데코레이터가 필요없이 똑같은 일을 할 것입니다. –

+0

상속 된 페이지에서 잘 작동했습니다. 하지만 MVC에서 레이아웃 (마스터 페이지) 내부에 동일한 주입 클래스 메소드에 액세스하기위한 솔루션은 무엇입니까? –

관련 문제