답변:
'SOLID'에서 'I'는 인터페이스 분리를 나타냅니다. 이 원칙의 전체 아이디어는 큰 인터페이스를 더 작은 모듈로 분할하는 것입니다. MVC 서비스에서는 일반적으로 컨트롤러가 의존하는 인터페이스가 있습니다. 컨트롤러가 해당 서비스의 구체적인 구현에 대해 알기를 원하지 않습니다. 따라서 한두 가지 방법으로 여러 서비스를 제공하는 것이 좋습니다.
일반적으로 서비스는 큰 응용 프로그램 또는 도메인 모델의 작은 응용 프로그램에서 직접 DTO를 반환합니다. DTO는 일반적으로 더 많은 작업을 의미하지만 우려를 더 잘 분리합니다. 일반적인 흐름은 다음과 같습니다.
매핑은 수동으로 수행 할 수 있지만 대부분의 개발자는 배관 코드 작성을 좋아하지 않고 매우 게으 르기 때문에 Automapper와 같은 자동 매핑 프레임 워크를 선호합니다.
http://en.wikipedia.org/wiki/Interface_segregation_principle
https://github.com/AutoMapper/AutoMapper
DTO 및 도메인 모델 사용과 관련하여 stackoverflow에 대한 여러 토론 중 하나 : https : //.com/questions/2680071/dto-or-domain-model-object-in-the-view-layer
MVC에서 모델은 DTO 또는 관리자 / 서비스 집합이 아니라 응용 프로그램이 모델링하는 개념을 나타냅니다. 이것을 전체 도메인 또는 상태와 행동을 포함한 비즈니스 로직으로 생각할 수 있습니다. 이제 컨트롤러의 목적이 좀 더 명확 해졌다는 것을 알았습니다. 작업은 단순히 명령을 모델로 변환하고 결과를 다시 뷰로 변환하는 것입니다. 이것은 일반적으로 MVC의 모델과 다르지만 종종 혼동되는 ViewModel의 형태로 수행됩니다.
잘 정의 된 모델이없는 경우 해당 로직의 대부분이 이제 컨트롤러 자체에있는 지점에 도달했을 수 있습니다. 이 시점에서 컨트롤러 크기를 줄이기 위해이 논리를 관리자 또는 서비스 개체로 다시 가져 오기 시작할 수 있습니다. 이러한 서비스는 일반적으로 DTO / Entity와 같은 개체에서 반환 및 작동합니다. 그런 다음 컨트롤러는 이러한 서비스와 뷰 모델 간의 매핑 계층이됩니다. 매핑에 대한 몇 가지 유용한 팁을 보려면이 기사를 살펴보십시오. 친구는 친구가 AutoMapper를 사용하지 못하게 합니다.
귀하의 질문에 관해서는, 첫 번째 질문은 귀하의 응용 프로그램에 달려 있습니다. 컨트롤러에서 로직을 제거한 후에는 더 분명 해져야하는 방식으로 리팩토링을 수행해야합니다. 테스트에 관해서는 서비스 내부에서 모델을 인스턴스화하는 데 문제가 없지만 테스트가 어렵다는 것을 발견하면 단일 책임으로 서비스를 더 작은 부분으로 나눌 필요가 있다는 신호 일 것입니다.
컨트롤러는 비즈니스 로직이 발생하는 모델에 대한 호출 만 포함해야하며 이러한 호출을 기반으로 뷰에 데이터를 할당합니다 (정보 또는 오류 메시지). 따라서 컨트롤러가 여전히 복잡한 경우 매우 복잡한 페이지에서도 컨트롤러는 매우 작습니다. 매우 커짐에 따라 해당 페이지를 더 많은 페이지로 확장해야한다고 생각해야합니다.
여전히 모델은 상당히 클 수 있습니다 ... 내가 찾은 솔루션에는 컨트롤러에 변수가있어로드 할 모델과 특정 작업에 대해 특정 모델을로드하는 것을 알려줍니다.
다음과 같이 모델 뷰 컨트롤러 모델을 깨끗하게 준수하십시오.
하나 이상의 컨트롤러가 수행해야 할 수도 있고 컨트롤러의 일부가 될 정도로 구체적이지 않은 로직을 수행하는 데 도움이되는 서비스가 컨트롤러가 너무 커서 읽기가 너무 어려워지는 것을 막습니다. .
나는 "모델 (bussiness logic이 발생한 곳)"이라고 말했을 때 개인적으로 'aaa'에 동의하지 않습니다. 그것이 컨트롤러를 가지고있는 모든 이유이기 때문에, 제 생각에 모델은 간단한 데이터 추상화자가되어야 컨트롤러가 필요한 작업을 수행 할 수 있습니다. 다시 서비스가 데이터 추상화 작업에 관여해서는 안됩니다 ...
그냥 요 ..