2016-10-08 3 views
2

메신저 asp.net 코어를 사용하고 있습니다. 컨트롤러와 함께 모델을 사용하는 기본 방법은 다음과 같습니다.언제 데이터 클래스가 필요합니까?

public class BookController : Controller 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    public BookController(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public IActionResult Create(Book model) 
    { 
     // adding new model 
    } 

    public IActionResult Edit(Book model) 
    { 
     // modifying the model 
    } 

    public IActionResult Delete(Book model) 
    { 
     // removing the model 
    } 
} 

내 질문 : 컨트롤러 내부에서 코드를 구현해야합니까? 언제 다른 수업에 그것을 시행해야합니까? 이 같은

뭔가 : 나는 같은 필요로하는 많은 컨트롤러가 : 인터페이스, 나는 그것이 경우에 유용 할 수있다 생각 들어

public IActionResult Create(Book model) 
{ 
    var bookData = new BookData(_context); 
    int result = bookData.Add(model); 

    // ... 
} 

: 컨트롤러 내부에서 그것을 호출 다음

public interface IBook 
{ 
    int Add(Book book); 

    int Update(Book book); 

    int Remove(Book book); 
} 

public class BookData : IBook 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    BookData(ApplicationDbContext context) 
    { 
     _context = context 
    } 

    public int Add(Book model) 
    { 
     // ... 

     return _context.SaveChanges(); 
    } 

    // other implements... 
} 

, 액션/메소드 이름.

예 : MessageController은 최소한 (Create/Add, Edit/Update, Delete/Remove) 세 가지 작업/방법이 필요합니다.

public interface IMyService<T> where T : class 
{ 
    int Add(T model); 

    int Update(T model); 

    int Remove(T model); 
} 

public class MyService<T> : IMyService<T> where T : class 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    public MyService(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public int Add(T model) 
    { 
     Type type = typeof(model); 

     if (type == typeof(Book)) 
     { 
      // adding new book model 
     } 
     else if (type == typeof(Comment)) 
     { 
      // adding new comment model 
     } 

     // ... 

     return -1; 
    } 

    // other implements... 
} 

내가 뭔가를 오해 수행 그것은 그래서

, 인터페이스가 개선 될 수있다 ... NotificationController 클래스, CommentController 클래스와 동일합니다?

답변

2

데이터 클래스를 올바르게 읽으면 저장소 (퍼시스턴스 계층의 추상화)를 의미합니다. 항상 저장소 클래스, 명령/쿼리 패턴 또는 요청 처리기를 통해 클래스 뒤에 지속성 논리를 캡슐화하고 서비스 클래스의 컨텍스트를 직접 사용하는 대신 사용해야합니다.

즉, ApplicationDbContext 대신 컨트롤러에 BookData을 직접 삽입 할 수 있습니다. 현재 구현에서 잃어버린 점은 작업 단위 패턴입니다. 현재 모든 추가 기능이 즉시 데이터를 유지합니다.

이것은 원하는 것이 아니기 때문에 Add/Remove/Update 메서드 외부로 _context.SaveChanges();을 이동하고 명시 적으로 호출해야합니다. 이렇게하면 10 개의 레코드를 삽입 할 수 있으며, 하나가 실패하면 아무 것도 데이터베이스에 보존되지 않습니다.

각 삽입 후 _context.SaveChanges();을 호출하고 8 번째 (10 개) 레코드에서 오류가 발생하면 7 개가 지속되고 3 개가 누락되어 일치하지 않는 데이터가 발생합니다.

컨트롤러에는 논리가 전혀 포함되어서는 안되며 입력 모델 (ModelState.IsValid 검사)의 유효성 검사 만 수행하고 괜찮 으면 논리를 모두 수행하는 서비스를 호출하여 결과를 다시 사용자에게보고하십시오. 아주 단순한 튜토리얼 및 가이드 로직에서 만 단순성을 이유로 컨트롤러 동작에 넣습니다. 실제 응용 프로그램에서는 절대로 그렇게해서는 안됩니다. 컨트롤러는 서비스 클래스보다 단위 테스트가 훨씬 어렵습니다.

관련 문제