2009-11-19 6 views
50

컨트롤러에 대한 생성자가 각 웹 요청 중에 호출되지 않는다는 것을 이해합니다. 이것이 사실이라고 가정하면 컨트롤러의 수명은 어떻게됩니까? 앱 시작시 "생성"되어 캐시되고 requestcontext가 각 웹 요청과 함께 주입 된 상태로 호출됩니까?ASP.NET MVC 컨트롤러 수명주기

그냥 생성자 동작을 에뮬레이트하는 방법을 묻지 않고 있습니다. OnActionExecuting 이벤트를 사용하여 일반적으로 생성자에서 수행 할 작업을 시작합니다. 또한 단위 및 시스템 테스트를 위해 컨트롤러에서 생성자를 사용합니다.

감사합니다.

답변

74

default controller factory을 사용하는 경우 각 요청에 대해 새 인스턴스가 생성되며 이것이 있어야합니다. 컨트롤러는 서로 다른 요청간에 공유되어서는 안됩니다. 컨트롤러의 수명을 관리하는 사용자 정의 팩토리를 작성할 수도 있습니다.

+10

왜 그래도? 왜? –

+2

나는 왜 망설이고 이것이 왜 그런지와 틀림없이 나 자신에게 가르쳤다. EF를 사용하여 읽기/쓰기 작업과보기로 컨트롤러를 생성했습니다. 생성 된 코드는 EF 컨텍스트 인스턴스에 대한 전용 인스턴스 변수를 생성했습니다. 나는 똑똑하고 정적 인 변수로 만들 것이라고 생각했습니다. 문제는이 컨트롤러의 범위 밖에있는 것이 데이터베이스를 수정하면 정적 컨텍스트가 결코 알 수 없다는 것입니다. 이제 인스턴스 변수로 남겨두고 각 요청마다 새 인스턴스가 만들어지기 때문에 컨텍스트는 데이터베이스에 대한 모든 변경 사항을 볼 수 있습니다. – ThatAintWorking

+1

모든 상태가 매개 변수 (즉, 기능 스타일)에 포함되어있는 웹 API에서 컨트롤러를 재사용 할 수없는 이유는 무엇인지 알 수 있습니다. 이것은 설계 상 thread로부터 안전합니다. –

10

두렵습니다. 이해가 잘못되었습니다. 컨트롤러 (매우 얇고 가벼운 클래스 여야하며 세션 수명 상태가 없어야 함)는 실제로 각 웹 요청에 대해 즉석에서 생성됩니다. 어떻게 컨트롤러 인스턴스가 특정 뷰에 특정 될 수 있습니까?

그래서 모든 당신이 할 요청에 대한

1

컨트롤러가 생성됩니다 ...는 "라이프 사이클"(요청 이외의) 같은 것은 존재하지 않는다. 예를 들어 보겠습니다.

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

이제 사용자 이름을 전달하는보기에서 컨트롤러를 호출 할 수 있습니다. 다음 요청에서 설정 한 userName을 얻지 않기를 바랍니다. null가 돌려 주어집니다. 따라서 모든 요청에 ​​대해 새로운 컨트롤러가 생성됩니다. 클래스에서 객체를 인스턴스화하는 것처럼 MVC의 어느 곳에서나 컨트롤러를 인스턴스화하지 않습니다. 단순히 다른 객체와 마찬가지로 컨트롤러 객체 메모리 포인터를 호출하지 않아도됩니다.

이 링크로 이동하십시오. MVC 컨트롤러의 수명주기에 대한 좋은 설명이 있습니다.

ASP.Net MVC - Request Life Cycle