2010-03-22 4 views
4

인사말 내 모든 컨트롤러에 내 모델을 감싸고 서비스 계층에 액세스하기 위해 동일한 코드를 재활용 - 나는 각 컨트롤러에 복사/붙여 넣기 그것을 위해 피곤 해요 :MVC 모델 주

private IProjectService _service; 
public New() 
{ 
_service = new ProjectService(new ModelValidation(this.ModelState)); 
} 
public New(IProjectService service) 
{ 
_service = service; 
} 

내 모든 컨트롤러가 액세스 할 수있는 곳에이 위치를 배치 할 수있는 곳이 있습니까?

답변

5

당신은 다른 모든 컨트롤러에서 상속 기본 컨트롤러 클래스에 넣어 수 : 또는

public class BaseController : Controller 
{ 
    protected IProjectService Service { get; private set; } 
    public New() 
    { 
     Service = new ProjectService(new ModelValidation(this.ModelState)); 
    } 
    public New(IProjectService service) 
    { 
     Service = service; 
    } 
} 

, 당신은 dependency injection에 읽어 이러한 종속성을 주입하는 IOC 컨테이너를 사용하여 볼 수 있었다.

+0

+1 DI를 언급 한 경우 컨트롤러 클래스가 서비스에 종속되어 있고 서비스의 유효한 인스턴스가 없으면 수행 할 수 없기 때문에 IProjectService에 대한 생성자 삽입을 추가합니다 – Sunny

+0

@Sunny - 이것에 대한 여러 학교. 필자는 필요한 의존성에 대해 생성자 삽입을 사용하는 것에 대한 논쟁을 이해하지만, 일관된 주입 접근법을 사용하는 논쟁이 있으며, 물론 모든 IOC 컨테이너가 모든 메소드를 다른 것들처럼 쉽게 지원하는 것은 아닙니다. 그러나 이것은 피사체 주위를 희망적으로 읽을 때 OP가 픽업 할 일종의 것입니다. –

1

컨트롤러 기본 클래스?

1

기본 컨트롤러를 만들고 그 컨트롤러를 파생시킵니다.

public class BaseController : Controller 
{ 
     protected IProjectService _service; 
     public New() 
     { 
      _service = new ProjectService(new ModelValidation(this.ModelState)); 
     } 
     public New(IProjectService service) 
     { 
      _service = service; 
     } 
} 
public class MyController : BaseController 
{ 
    public ActionResult Index() 
    { 
    } 
} 
2

code smells의 멋진 세계에 오신 것을 환영합니다. 그것이 무엇인지 모른 채 당신은 하나를 발견했습니다. 언제든지 너 자신에게 생각해. "더 좋은 방법이 있어야합니다." 저기있다. 이 경우 기본 클래스는 문제를 해결하는 데 큰 도움이됩니다.

+1

예, 많은 코드를 복사/붙여 넣기 할 때마다 일반적으로 더 좋은 방법이 있습니다! :) – mlsteeves