2011-12-16 1 views
1

컨트롤러와 통신하는 방법이 간단한 시나리오 작동MVC - 서비스 계층은 내 컨트롤러 액션에 대해 다음과 같은 패턴을 사용하고있다

public ActionResult Create(CreateViewModel model) { 
    if(!ModelState.IsValid) { 
     return View(model); 
    } 

    var project = new Project { 
     Name = model.Name, 
     // ... 
    }; 

    projectRepository.Add(project); 

    return RedirectToAction("Index"); 
} 

,하지만 몇 가지 상황이 있었다 곳 저장소 충분하지 않다. 필자는 프로젝트 저장 및 추가 비즈니스 로직 (유창한 유효성 검사 또는 데이터 주석이있는 일반 유효성 검사가 아닌)을 처리 할 서비스 계층/클래스를 만들었습니다.

public class ProjectService : IProjectService { 

    void AddProject(Project project) { 
     // do business logic 
     // ... 

     repository.Add(project); 
    } 
} 

내 서비스 계층이 내 컨트롤러와 어떻게 쉽게 통신 할 수 있습니까?

내가 컨트롤러와 통신하고자하는 사물의 종류 :

  • 비즈니스 로직/유효성 검사 오류
  • 데이터베이스 실패

어떻게 수 (등을 저장하지 못했습니다) 서비스 레이어에서 true/false 또는 상태 코드를 반환하지 않고이 작업을 수행합니까?

답변

1

오류가 발생했을 때 자세한 메시지를 반환하려면 항상 예외를 사용할 수 있습니다. 특정 세부 정보로 사용자 정의하거나 .NET Framework에 이미있는 항목을 다시 사용할 수도 있습니다.

이 옵션이 아니면 항상 더 자세한 오류 정보를 포함하고 컨트롤러에서 처리 할 수있는 래퍼 클래스를 반환 할 수 있습니다.

2

예외를 선택하는 경우 비용이 많이 들기 때문에주의하십시오. 얼마나 많은 예외가 발생할지에 따라 컨트롤러 코드에 추가 중첩도 제공됩니다. 예외 상황에 대해서만 예외를 던져야하며 응용 프로그램의 정상적인 흐름에 의해 처리되어야하는 것은 아닙니다.

나는 Wouter de Kort가 제안한 다른 경로와 함께 메시징 개체에 대한 서비스의 반환 형식을 사용합니다. 서비스에서 발생할 수있는 여러 가지 사례로 간단한 enum에서 리턴 메시지 객체에 키를 지정할 수 있습니다. try/catch보다는 스위치/케이스로 열거 형을 처리 할 수 ​​있기 때문에 컨트롤러에서 더 잘 보입니다.

업데이트

메시징 객체처럼 보일 수 있습니다 무엇 :

public interface IServiceAbc 
{ 
    ServiceResponse InvokeMyService([params]); 
} 

public enum ResponseScenario 
{ 
    Success, 
    DatabaseFailed, 
    BusinessRuleViolated, 
    ValidationRuleViolated 
} 

public class ServiceResponse 
{ 
    public ResponseScenario Scenario { get; internal set; } 
    public string Message { get; internal set; } 
}