중규모 MVC 웹 응용 프로그램의 아키텍처를 계획 할 때 가능한 한 분리되고 테스트하기 쉬운 계층을 어떻게 구현합니까? (기본적으로 모범 사례를 따르십시오) 먼저 데이터 액세스로 코드를 사용한다고 가정 해 봅시다.
"비즈니스 로직"을 정의하는 것과 데이터 계층과 상호 작용하는 방법에 대해 고민합니다. 차량 판매 애플리케이션을 예로 들어, 비즈니스 로직은 주어진 차량에 대한 세금 대역 계산, 갤런 당 마일 통계 비교 등과 같은 작업을 수행하는 클래스입니까? 비즈니스 엔티티 (예 : Cars, Vans, Motorcycles)에 대해서는 DataContext
클래스 와 함께 데이터 계층에 넣습니다 .
또한 비즈니스와 달리 응용 프로그램 논리를 구성하는 것은 무엇입니까? 세션 / 사용자 입력 유효성 검사와 같은 것을 추측하고 있습니까?
예를 들어, 자동차 컨트롤러는 유형 및 최고 mpg로 필터링 된 상위 10 대 자동차를 나열하는 동작 /보기 결과를 반환 할 수 있습니다. 그래서 ICarRepository
컨트롤러에 'carRepo'를 주입 했다고 가정 하고 (저장소 패턴 / DI를 사용하여) 액션 메소드 매개 변수에서 자동차를 필터링합니다.var cars = carRepo.getCarsByType("hatchback");
따라서 저장소를 사용하여 컨트롤러에서 데이터 액세스 지식을 유지했습니다. 이제 도메인 모델을 사용하여 비즈니스 로직을 컨트롤러에서 유지합니다. var result = new MpgCalculator (cars); -DB에서 엔티티를로드 / 필터링하는 것보다 최상의 연료 효율을 계산하기 위해 추가 논리를 수행해야하기 때문에 계산기 클래스가 필요하다고 가정 해 봅시다. 이제 저장소를 사용하여 데이터 액세스 계층에서 검색하고 해당 데이터에서 비즈니스 관련 작업을 처리하고 수행하는 도메인 특정 개체를 렌더링하는 뷰에 대한 데이터 세트가 있습니다.
내가 실수를 저지르고 있습니까? 우리는 여전히 저장소 패턴을 사용해야합니까, 아니면 ORM과 테스트를 분리하기 위해 인터페이스에 대해 코딩 할 수 있습니까? 이 주제에서는 구체적인 데이터 액세스 클래스 dbcontext가 데이터 계층에 있으므로 인터페이스 정의가 도메인 / 비즈니스 계층으로 이동해야하는데 이는 데이터 액세스 기술이 변경 되어도 다른 계층에 영향을 미치지 않습니까?
지금까지 내가 연구 한 내용에서 내 구조는 다음과 같습니다.
MVC 인터넷 애플리케이션 -> 표준 인터넷 프로젝트-여기 모델은 ViewModels입니다
도메인 / 비즈니스 계층 -> 관련 뷰로 전달하기 전에 컨트롤러가 데이터 계층에서 도메인 엔티티를 처리하는 데 사용할 수있는 비즈니스 특정 클래스 / 모델
리포지토리 추상화가 필요합니까? -> 특히 ORM을 사용할 때 이것에 대해 많은 토론을 듣는다
데이터 계층 -> 엔티티 클래스 (Car, Van, Motorcycle), DbContext-콘크리트 데이터 액세스 기술 계층