2010-06-24 4 views
2

다음 값이 될 수있는 상태 변수를 받아들이는 List라는 컨트롤러 POST 작업이 있습니다 { "all", "active", " .} 비활성 그럼 난 컨트롤러의 내부에서 "상태"의 값에 따라 저장소에 전화를했다 컨트롤러는이처럼 보였다 :.리포지토리 기능을 확장하는 서비스로 컨트롤러 논리를 추출하는 것이 좋습니다

[HttpPost] 
    public ActionResult List(string status) 
    { 
     return View(GetJobTitlesByStatus(status)); 
    } 

    private IList<JobTitle> GetJobTitlesByStatus(string status) 
    { 
     IList<JobTitle> jobTitles; 

     switch (status) 
     { 
      case "All": 
       jobTitles = jobTitleRepository.GetAll(); 
       break; 
      case "Active": 
       jobTitles = jobTitleRepository.GetActive(); 
       break; 
      case "Inactive": 
       jobTitles = jobTitleRepository.GetInactive(); 
       break; 
      default: 
       jobTitles = new List<JobTitle>(); 
       break; 
     } 
    } 

내가 스위치 문에서 코드가 내부에 너무 많은 것을 결정 컨트롤러의 내용을 추출하여 서비스로 추출한 다음이 서비스가 적절한 리포지토리 호출을 생성합니다 (예 :

public class JobTitleService : JobTitleRepository, IJobTitleService, IJobTitleRepository 
{ 
    public JobTitleService(ISession session) : base(session) { } 
    public IList<JobTitle> GetJobTitlesByStatus(string status) 
    { 
     IList<JobTitle> jobTitles; 

     switch (status) 
     { 
      case "All": 
       jobTitles = base.GetAll(); 
       break; 
      case "Active": 
       jobTitles = base.GetActive(); 
       break; 
      case "Inactive": 
       jobTitles = base.GetInactive(); 
       break; 
      default: 
       jobTitles = new List<JobTitle>(); 
       break; 
     } 

     return jobTitles; 
    } 
} 
).

저는 개인적으로 의존성 주입을 사용하여 컨트롤러에 서비스를 제공하기 때문에 이것이 훌륭하게 작동한다고 생각합니다. 다음과 같은 질문이 있습니다 :

1) 컨트롤러에서 switch 문 논리를 추출하는 것이 좋습니다.
2) JobTitleService를 JobTitleRepository에서 상속받는 것이(종속성 주입을 사용하여 서비스의 생성자로 전달 된 IJobTitleRepository를 갖는 것)보다 낫다고 생각합니까?
3) JobTitleService에 사용되는 디자인 패턴에 특별한 이름이 있습니까?

답변

3
  1. 예 - 컨트롤러가 모델을 통과 한 후, 그 결과를 선택 모델을 준비하고 대한 책임을 져야한다 렌더링을위한 뷰. 그 밖의 모든 것은 다른 서비스, 일반적으로 서비스로 위임되어야합니다. wikipedia에서 직접 촬영 :

    컨트롤러는 입력을 수신하고 모델 개체에 대한 호출 함으로써 반응을 개시한다. 컨트롤러는 사용자로부터 입력을 받아들이고 해당 입력을 기반으로 작업을 수행하기 위해 모델 및 뷰포트에 지시합니다.

  2. 아니요, 서비스가 저장소에서 상속되지 않아야합니다.서비스는 저장소와 협력하여 기능을 수행해야하므로 'is-a'가 아닌 'is-a'관계입니다. 지금 당장은 서비스가 저장소에 대한 패스 스루 일 뿐이므로 서비스가 수행해야하는 서비스를 시작하자마자 (즉, 하나 이상의 공동 작업자의 작업을 조정할 때) 곧바로됩니다. 이러한 공동 작업자 중 한 명으로부터 만 상속 할 수 있으므로 분명합니다.

    실제로이 경우 서비스가 저장소 주위의 직접 래퍼가 될 경우 아무 것도 추가하지 않고 단지 간접적 인 계층 일뿐입니다. 간략하게 설명하면 간략하게 말하면 저장소에 직접. 일반적으로 사물은 그렇게 단순하게 오래 머물러 있지 않습니다.

  3. 아니요.

+0

흠. 좋은 질문에 대한 크레딧이 없습니까? 롤. – SideFX

2

1) 예, 비즈니스 로직이 컨트롤러에 없어야합니다. 컨트롤러는 실제로 프레젠테이션을 로직에 연결합니다. 이상적으로, 논리는 여기에있는보다 절차 지향적 인 접근 방식보다 더 객체 지향적 인 접근 방식으로 수행되지만 그로 인해 어려움을 겪지는 않습니다. 절차가 코드가 간단하고 지원 가능한 한 나쁜 것은 아닙니다. 이 디자인이 당신을 위해 무엇을하는지는 당신이 필요하다면 서비스 클래스를 실제 분리 된 서비스로 옮기는 것을 허용합니다.

2) 문제를 정량화하는 데 문제가 있습니다.하지만 저장소에서 서비스를 상속받는 것을 주저합니다. 이 특정 디자인에서는 서비스를 비즈니스 로직 프로 시저를 저장하는 장소로보고 리포지토리가 지속성 인식 구성 요소로 주입됩니다 (비즈니스 로직은 지속성을 인식하지 않아야 함). 나는 단지 그것이 문제를보다 깔끔하게 구분하고, 시스템이 성장함에 따라 디자인을 완전히 깬 것이 더 쉽다고 생각한다. 하지만 이것은 내 개인적인 견해 일뿐입니다.

3) 어딘가에 이력서를 쓸 수있는 공식 이름이있을 것입니다. "다른 SOA를 염두에두고"Service Oriented Architecture "가 유행합니다. 나는 결코 용어에 대해 큰 적이 없기 때문에 나는이 부분에서 많은 도움을 줄 수 없다. 그러나 주제에 대한 많은 독서 자료가 있습니다. 뿐만 아니라 http://msdn.microsoft.com/en-us/library/ms954638.aspx 어쩌면 자원 여기를 찾습니다 :이 그런 일을위한 좋은 읽기처럼 보인다 http://www.soapatterns.org/

+0

디자인 관점에서 볼 때 저장소에서 상속하지 않고 저장소에 저장소를 삽입한다고 말하고 있습니까? – SideFX

+1

그건 내가 현재의 디자인에서하는 일입니다. 시간이 지남에 따라 풍미가 변할 수 있음을 누가 압니다. 그러나 현재 나는 Anemic Domain Model의 일종으로 일하고 있습니다. "서비스"는 "프로세서"라고 불리우는 반면 (실제 서비스의이면에 있다는 혼란은 없습니다) 아이디어는 본질적으로 같습니다. 당신이 그것에 대해 매력적인 논쟁을 찾을 수 있다면, 나는 내 자신의 디자인을 향상시킬 수 있도록 알고 싶습니다. 내 블로그 (내 프로필에서 링크)는 초기 단계이기는하지만 지금은이를 탐구하기위한 개인적인 출발점입니다. – David

+0

JobTitleRepository에서 상속 받기 때문에 서비스가 "저장소"임을 의미하므로 이해할 수 있습니다. 나는 이것을 원한다고 생각하지 않는다. 그러나 서비스에 저장소를 삽입하면 서비스에서 Save()와 같은 메서드를 호출 할 수 있어야하므로 저장소에 위임하는 메서드를 거의 만들어야합니다. 이 중복성을 방지 할 수있는 것이 있습니까? – SideFX

관련 문제