2012-03-15 5 views
7

각 도메인 엔티티에 대해 데이터 매퍼에 API를 제공하는 저장소가 있다고 가정 해 보겠습니다. 예를 들어, UserEntity가있는 경우 사용자 데이터를 데이터베이스에 유지하기 위해 UserMapper와 통신하는 UserRepository를 갖게됩니다.새 도메인 엔티티를 만들 위치는 어디입니까? 컨트롤러, 저장소 또는 매퍼?

이제 양식이 웹 페이지에 제출되고 내 컨트롤러가 제출 된 정보를 기반으로 새로운 UserEntity를 작성해야한다는 것을 알고 있다고 가정 해 보겠습니다.

그것을합니까 :

  1. 하면 그 자리에서 바로 거기) 새로운 UserEntity을 (수행 및 제출 양식 데이터에 따라 필요한 모든 setter 메소드를 실행 한 후 누가로 전달의 REPO에 UserEntity 전달 삽입을위한 매퍼?

    컨트롤러가 생성 UserEntity => 리포 => 매퍼 => DB

  2. 배열로 폼 데이터를 설정 한 다음 새로운 UserEntity() 및 세터를 실행 UserRepository에 전달하고, 그것을 통과

    삽입을위한 매퍼?

    제어기는 사용자 데이터를 전달 => 리포 만들고 UserEntity => 매퍼 =>

  3. 새로운 UserEntity 및 삽입을위한 매퍼 어레이를 통과 UserRepository로 배열 전달 DB?

    제어기는 사용자 데이터를 전달 => 리포 통과 사용자 데이터 => 매퍼 생성 UserEntity =>은 책임이 오브젝트의 생성을 관리하는

DB

?

답변

1

이것은 어려운 질문입니다. 내 두 센트는 몇 가지 이유로 번호 1에 있습니다. 첫째, 엔티티에서 전달되는 데이터를 거부 할 수있는 도메인 유효성 검사가 있다고 가정합니다. 그것이 2 또는 3에서 일어날 것이라면, 당신은 거절하기 전에 몇 가지 물건을 깊이 들어갔습니다. 2/3과 1의 차이점에있어 많은 메모리 또는 실행 시간이 아닐 수도 있지만 차이점은 있습니다. 나는 빨리 실패하려고 노력한다.

둘째로, 나는 컨트롤러가 객체뿐만 아니라 전달되는 데이터에 대해 알고 있다고 생각합니다. 나는 "뚱뚱한 모형, 마른 체형 컨트롤러"에 동의하지만 콘트롤러가 엔티티에 대해 알지 못한다고 말하는 것은 콘트롤러를 만든다. 너무 내 마음에 드는 스키니.

+0

위의 상황을 자세히 분석했습니다. 나는 다른 생각을 듣기에 호기심이 있지만, 분명히 그것을 컨트롤러에서 만들 수 있다고 생각합니다. 그러나 융통성이 부족한가요? 예를 들어 DB의 User 테이블에 새 필드를 추가하면 UserEntities를 만드는 각 Controller로 이동해야한다는 것을 기억해야합니다. – johnnietheblack

+0

새 정보를 받아들이는보기를 편집 할 가능성이 높습니다 (기존의 웹 응용 프로그램에 대한 내용을 가정 할 때). 컨트롤러를 편집하는 것은 그리 쉬운 일이 아닙니다. 뷰를 편집하는 것을 잊어 버린 컨트롤러를 편집하는 것을 잊었을 가능성이 있습니다. 게다가 간단한 전역 검색을 통해 클래스가 사용되는 위치를 찾을 수 있습니다. – Crashspeeder

+0

또 다른 좋은 점은 Controller가 답이라면 나는 화나지 않는다. 그러나 여전히, 여러 곳에서 동일한 인스턴스화 과정을 작성하는 "유죄"를 느끼는 부분이있다. 아니? 같은 방식으로 필자는 새로운 테이블 변경을 반영하는 양식 필드를 추가하기 위해 단일 파일에서만 변경이 필요하도록 내보기를 설정했습니다. – johnnietheblack

2

나는이 질문이 오래된 것을 알고 있지만, 유일한 대답은 공식적으로 받아 들여지지 않았기 때문에 여기에 내 생각을 던질 것이라고 생각했다. 이것은 미래의 수색자에게 도움이 될 수있다. 직접 질문에 대답하려면 위의 어느 것도 말하지 말 것. 필자는 컨트롤러와 repo/mapper 객체 간의 상호 작용을 중개하기 위해 별도의 서비스 인 "관리자"를 선호합니다. 각 모델에는 생성, 업데이트 및 삭제를 처리하기위한 전용 관리자가 있습니다.

컨트롤러

나는 응용 프로그램의 접착제와 같은 컨트롤러를 고려한다. 우리가 원하는 모든 것을 가능한 한 많은 부분으로 분리 할 수 ​​있습니다. 그러나 어딘가에있는 부분에서는보기 측면과 모델 측면을 모두 이해해야하며 그 객체가 컨트롤러입니다. 즉, 나는 컨트롤러가 마른 체격이어야한다고 생각합니다. 컨트롤러의 유일한 실제 작업은 요청을 응답에 매핑하는 것입니다. 어떤 종류의 중간 처리도 다른 곳에서 시작해야합니다.

CRUD 앱에서는 새로운 개체를 인스턴스화하고 컨트롤러에서 유지하기가 매우 쉽습니다. 붙여 넣기 작업이 몇 줄 밖에 없기 때문에 두 번 이상 수행되었습니다. 객체 생성이 사소한 것이 아니라면 어떨까요? 많은 복잡한 관계가있는 응용 프로그램을 유지 관리하고 사용자가 작성한 작성은 종종 많은 객체를 동시에 생성합니다. 컨트롤러 및 모델 전용 환경에서 유지 관리하는 것은 실현 가능하지 않습니다. FormHandler 및 관리자 :

추가 서비스 레이어

이 문제를 처리하기 위해, 나는이 개 추가 서비스 레이어를 만들었습니다. 양식이 제출 될 때마다 양식 내용이 양식 처리기 계층으로 전송됩니다. 양식 핸들러는 들어오는 양식 데이터를 이해하고이를 정상화 할 책임이 있습니다. 그런 다음 양식 핸들러는 적절한 관리자 오브젝트로 데이터를 전달하여 처리 할 수 ​​있습니다. 관리자 개체는 데이터를 처리하고 도메인 계층을 업데이트합니다. 모델 작성, 모델 변경 및 백엔드에 대한 책임은 모델 담당자에게 있습니다.

이렇게하면 컨트롤러는 요청, 응답, 양식 (프레임 워크가 서버 측 양식 작성을 지원할 경우) 및 FormHandler에 대한 지식을 갖습니다. 양식 처리자는 양식 (또는 양식 데이터) 및 관리자에 대한 지식을 보유합니다. 관리자는 저장소, 매퍼 및 모델에 대해 잘 알고 있습니다. 이제 관리자는 모델 및 매퍼와의 유일한 상호 작용점이며 양식 데이터 또는 요청 또는 응답에 대해 알지 못합니다. 컨트롤러와 폼 핸들러는 도메인 계층 데이터 또는 지속성에 대해 알 필요가 없습니다.

이 디자인 결론

: 내가 찾은

Controller -> FormHandler -> ModelManager -> Mapper

내 모든 클래스 이제 단위 쓸만한 때문에 잘되는 영역의 분리에 (어느 정도라도 컨트롤러)입니다 분리되고, 상호 작용의 단일 지점은 중복 된 논리를 피하기위한 보탬이됩니다.

노트

내 마음의 환매 특약은 데이터베이스 쿼리입니다 - 뭔가가있는 경우 새로운 것을 창조하지, 그것을 요구.

이 경우 내 경험 심포니 2와 교리를 사용하는 것입니다

2.

YMMV; 예 : 양식 레이어가 불필요하다는 것을 알 수 있지만 양식 /보기 데이터에서 도메인 모델이 이해하는 데이터 변환에 매우 편리합니다.

관련 문제