2009-05-16 6 views
7

데이터베이스에 업데이트하거나 추가하기 전에 데이터베이스와 상호 작용해야하는 유효성 검사를 수행하는 방법에 대한 링크 또는 조언이 있습니까? 내가 본 모든 예는 속성을 검증하는 방법을 보여줍니다. "필수 항목", "전자 메일", "숫자"등이 있습니다. 그러나 "재고가없는 제품을 주문할 수 있습니까?" This xVal blog post은 그 위에 닿아 있지만 예제는 제공하지 않습니다.asp.net mvc 데이터베이스 상호 작용 유효성 검사

나는 리포지토리를 사용하는 NerdDinner 자습서를 따라 해왔지만, 이것은 내가 얻지 못하는 비트입니다. 우리가 Order 메서드를 가진 OrderController를 가지고 있다고 가정 해 봅시다. 아이템이 재고가 있는지 확인하십시오. NerdDinner 스타일에서 컨트롤러는 리포지토리을 사용하여 데이터베이스와 대화하므로 Order 객체 (Model)가 데이터베이스와 통신 할 수 없으므로 속성 유효성 검사와 함께이 유효성 검사를 어떻게 수행 할 수 있습니까? 어떤 도움

답변

0

나는 방법 PlaceOrder (주문 순서)과는 OrderService을 만들 것입니다에 대한

감사합니다. OrderService는 리포지토리를 사용하여 CRUD 작업을 수행하고 비즈니스 규칙 (재고 확인)을 시행하며 결국 사용자가 포착하여보고 할 수있는 규칙 위반에 대한 예외를 throw합니다.

+0

나는 이것을 NerdDinner의 컨텍스트에서 유지하고 현재 서비스를 사용하지 않기를 바랬습니다. 가능한 한 간단하게 모든 것을 묶어 놓는 방법으로 머리를 쓰려고합니다. 감사합니다 – atwrok8

3

NerdDinner 자습서에서 IsVaild 및 GetRuleViolation 메서드를 체크 아웃 할 수 있습니다. 비즈니스 및 데이터베이스 규칙에 따라이 규칙을 사용하여 데이터를 삽입하기 전에 데이터를 확인할 수 있습니다. IsValidForInsert 메서드를 만들어 구현해야하는 특정 규칙을 삽입 할 수 있습니다.

NerdDinner에서 GetRuleViolation을 사용하면 위반 된 규칙을 검색하여 선택한대로 인터페이스에 버블 링 할 수 있습니다.

public bool IsValid 
    { 
     get { return (GetRuleViolations().Count() == 0); } 
    } 

    public IEnumerable<RuleViolation> GetRuleViolations() 
    { 


     if (CheckDbForViolation) 
      yield return new RuleViolation("Database Violation", "SomeField"); 

     if (String.IsNullOrEmpty(Title)) 
      yield return new RuleViolation("Title is required", "Title"); 

     if (String.IsNullOrEmpty(Description)) 
      yield return new RuleViolation("Description is required", "Description"); 

     if (String.IsNullOrEmpty(HostedBy)) 
      yield return new RuleViolation("HostedBy is required", "HostedBy"); 

... etc ... 


     yield break; 
    } 

    public bool CheckDbForViolation() 

    { 

    /// Do your database work here... 

    } 

이 데이터베이스 코드를 저장소로 분할하면됩니다. CheckDbForViolation은 정보에 대한 repo를 호출 한 다음 위반이 있었는지 여부를 결정합니다. 사실 저장소를 사용하고 있다면, 그렇게하는 것이 바람직한 방법이라고 생각합니다.

+0

나는 IsValid와 GetRuleViolations에 대해 읽었지만 "재고가없는 아이템을 주문할 수 없다"라는 시나리오는 언급되어 있지 않습니다. 이러한 유형의 비즈니스 규칙은 어디에 배치됩니까? 덕분에 – atwrok8

+0

유효성 검사 단계 중 하나는 나가서 항목이 재고가 있는지 확인하기 위해 데이터베이스를 쿼리하는 것입니다. 그런 다음 데이터베이스가 올바르게 작동하거나 실패 할 경우 계속 진행하여 데이터베이스 쓰기가 실행되지 않도록하십시오. –

+0

나는 유효성 검사 단계가 무엇인지 이해하지만 로직은 어디로 갈 것인가? 컨트롤러는 리포지토리를 사용하므로이 논리를 컨트롤러에 있어야하는 데이터베이스를 쿼리 할 수는 있지만 비즈니스 규칙이 모델에 남아 있어야한다는 것을 이해하고 있습니까? 컨트롤러가 저장소를 사용하면 안된다고 생각하기 시작했습니다. 감사합니다 – atwrok8

1

실제로 수행 방법에 대한 지침은 필요하지 않습니다. 궁극적으로 당신은 창조적이라는 것을 의미하는 그런 어플리케이션을 스스로 만들 수 있어야합니다.

필자는 처음부터 제한 기능을 사용하지 않기 위해 기본 제공되는 유효성 검사 또는 멤버십 API를 사용하지 않기로 결정했습니다.

상황에 따라 : 거의 표준입니다. 다음과 같이

은 실행 흐름을 상상해

  1. 포스트 양식
  2. 유효성 검사 입력 데이터 형식을 데이터베이스에 알리지 않고
  3. (2) 패스 인 경우에, 당신은의 지점에서 입력의 유효성을 검사 비즈니스 규칙/데이터 무결성. 데이터베이스와의 대화가 있습니다
  4. (3)이 통과 된 경우 작업을 수행하십시오. 어떻게 든 실패하면 (데이터베이스의 데이터 무결성 규칙으로 인해 다른 브라우저 창에서 관련 객체를 삭제 한 것처럼) 작업을 취소하고 사용자에게 작업 오류를 알립니다.

가능한 한 컨트롤러 메서드를 비우십시오. 유효성 확인 및 작업 논리는 모델 및 비즈니스 논리에 있어야합니다.컨트롤러는 기본적으로 하나의 의도 된 작업을 시도하고 반환 된 상태에 따라 하나의 뷰 또는 다른 뷰를 반환합니다. 어쩌면 몇 가지 옵션이 있지만 사용자 역할, 액세스 권한, 일부 웹 서비스 호출 등에 대한 전체 검사가 필요하지는 않습니다. 간단하게 유지하십시오.

P. 때로는 대다수 개발자가 단순한 작업을 단순화하기 위해 내장 된 기능이 제거 된 기능에 새로운 장벽을 만드는 경향이 있다는 인상을 받기도합니다.

+0

당신이 열거 한 실행 흐름은 정확히 내가 할 일이고, 유효성 검사가 배치 될 NerdDinner 예제에 관해서는 확실치 않습니다. Order 객체가 Repository를 사용하고 Controller가 Order 객체에 대해서만 말하면 더 나을 것입니다. 이 방법을 사용하면 Order 객체가 두 가지 형식의 유효성 검사를 모두 처리 할 수 ​​있으므로 이제는 데이터베이스와 대화 할 수 있습니다. 더 나은 옵션이 될 것이라고 생각하십니까? 감사합니다 – atwrok8

+0

NerdDinner 예제에 익숙하지 않습니다. "리포지토리"가 일종의 데이터베이스 계층을 나타내는 경우 중간 비즈니스 로직 계층 (예 : Order는 비즈니스 개체로 간주 될 수 있음)이 있지만 컨트롤러가 리포지토리를 어떤 용도로든 직접 사용하는 것은 분명히 잘못되었습니다. 통신은 다음과 같아야합니다 : [Controller] <-> BLL <-> DAL. 때로는 BLL 대신에 모델을 사용하기도하지만 정확하게 맞지는 않습니다. 모델은 뷰가 표시 할 수 있도록 데이터를 포장하기위한 것입니다. – User

관련 문제