2011-09-02 5 views
1

간단한 로그 서비스가있는 MVC3 앱이 있습니다. 모든 서비스는 Microsoft의 Unity Dependency Injection 컨테이너를 사용하여 호출됩니다.MVC3 : 로거 클래스에 대한 종속성을 추가 할 적절한 곳입니까?

대부분의 방법에서 예외를 무시합니다. 그들은 최고 수준의 오류 처리기에 걸려 있습니다.이 오류 처리기는 오류를 분류하고 오류를 기록할지 여부를 결정하고, 원하는 HTTP 응답을 생성하고 오류 컨트롤러에서 조치 방법을 호출하여 내 오류 페이지를 반환합니다.

가끔은, 나는 그것을하고 싶지 않습니다. 예외가 발생하는 곳을 처리하고 싶습니다. 내 컨트롤러에. 이 경우 적절한 기본값으로 대체하고 컨트롤러의 논리를 계속하기 전에 오류를 기록하고 싶습니다. 내 컨트롤러, I 추가 : (나중에 동일한 방법으로, 발생으로)

var logService = DependencyResolver.Current.GetService<ILogService>(); 
try { /* something indeterminate */ } 
catch (Exception ex) { 
    logService.LogException(category, ex); 
    /* do something else instead */ 
} 

가 지금은 해당 컨트롤러에서를 두 번째로 수행 할

나는 한 곳에서 것을했다. 내가 이것을 다시 한 번 반복 할 때, 나는 스스로를 반복하고 있기 때문에 그것이 리 팩터가 될 때라고 생각한다.

내 로거를 내 컨트롤러에서 사용하는 가장 좋은 방법은 무엇입니까? 내 컨트롤러는 모두 사용자 지정 ControllerBase에서 상속받습니다. 내 첫 번째 생각은 ControllerBase의 생성자에 추가하는 것입니다. 하지만 :

현재
  1. 나는 ControllerBase에서 생성자가없는,
  2. 내가있어 조금 컨트롤러의 DI 컨테이너를 참조하는의 값을 부정, 컨트롤러의 절연을 파괴 걱정 , DI로 시작하고,
  3. 나는 컨트롤러 만 매개 변수가없는 생성자를 가질 수 있습니다 (I 그것을 이해 으로 'm의 잘못이있는 경우, PLS 날 수정) 때문에 나는의 ControllerBase의 생성자에 로거를 전달할 수 있다고 생각하지 않습니다 따라서 에는 아무 것도 전달할 수 없습니다.

내 모든 컨트롤러에서 서비스를 사용할 수있는 적절한 위치는 어디입니까?

답변

3

생성자에 배치하십시오. BaseController에 배치 할 수도 있습니다.

이상적으로는 종속성 삽입을 사용하여 컨트롤러에 올리십시오. 컨트롤러 에는 IoC 컨테이너가 지원하는 경우 매개 변수가 있습니다.

private readonly ILogService logService; 
public MyController(ILogService logService) 
{ 
    this.logService = logService; 
} 
+0

잘 작동했는데 하늘이 내 머리에 떨어지지 않았습니다! 감사합니다 - 매개 변수없는 생성자에 대한 이러한 모든 논의를 계속 보았습니다. 그리고 이는 DI 컨테이너가 아니라 MVC 프레임 워크의 한계라고 생각했습니다. – Val

1

나는 그것을 산발적으로 사용하는 것처럼 들리는 유일한 이유 때문에 기본 컨트롤러에 추가하지 않을 것입니다. Daniel White가 컨트롤러의 생성자에서 제안하는대로 추가 할 것입니다. 마치 대부분의 컨트롤러에서 사용하는 것처럼 보이면 기본으로 이동하는 것이 좋습니다.

관련 문제