문제

POCO=일반전 CLR(또는 더 나은:클래스)객체

DTO=데이터 전송 전체

게시 이에는 차이가 있지만 솔직하게 대부분의 블로그를 읽을 설명하 POCO 방 DTO 정의된다:Dto 로은 간단한 데이터를 사용되는 컨테이너 이동을 위해 데이터 레이어 사이의 응용 프로그램입니다.

는 POCO 및 DTO 같은 것은?

도움이 되었습니까?

해결책

Poco는 OOP의 규칙을 따릅니다. 상태가 있어야합니다. 그리고 행동. Poco는 Martin Fowler에 의해 만들어진 Pojo에서 온 것입니다.여기서 일화]. 그는 Pojo라는 용어를 프레임 워크 무거운 EJB 구현을 거부하는 것이 더 섹시하게 만드는 방법으로 사용했습니다. poco는 .NET의 동일한 컨텍스트에서 사용해야합니다. 프레임 워크가 객체의 디자인을 지시하지 않도록하십시오.

DTO의 유일한 목적은 상태를 전송하는 것이며 행동이 없어야합니다. 마틴 파울러를 참조하십시오 DTO의 설명 이 패턴의 사용의 예.

차이점은 다음과 같습니다. Poco는 프로그래밍에 대한 접근 방식을 설명합니다 (좋은 구식 객체 지향 프로그래밍), 여기서 DTO는 패턴입니다 객체를 사용하여 "데이터 전송"에 사용됩니다.

DTO와 같은 Pocos를 처리 할 수는 있지만 빈혈 영역 모델 당신이 그렇게한다면. 또한 DTO는 비즈니스 영역의 실제 구조를 나타내지 않고 데이터를 전송하도록 설계되어야하므로 구조가 불일치합니다. 그 결과 DTO가 실제 도메인보다 평평한 경향이 있다는 것입니다.

합리적인 복잡성의 도메인에서는 별도의 도메인 Pocos를 만들어 DTO로 번역하는 것이 거의 항상 더 좋습니다. DDD (Domain Driven Design) 반부패 층 (다른 링크 여기, 그러나 가장 좋은 일은입니다 책을 사십시오), 이것은 분리를 깨끗하게 만드는 좋은 구조입니다.

다른 팁

블로그 기사에서 이미 내 입장을 언급 한 이후로 기여하는 것은 아마도 중복 될 것입니다. 그러나 그 기사의 마지막 단락은 다음과 같습니다.

따라서 결론적으로 Poco를 사랑하는 법을 배우고 DTO와 동일하다는 것에 대한 잘못된 정보를 전파하지 않도록하십시오. DTO는 응용 프로그램 계층간에 데이터를 이동하는 데 사용되는 간단한 데이터 컨테이너입니다. Pocos는 지속성이라는 요구 사항을 가진 완전한 비즈니스 객체입니다 (Get 또는 Save 방법은 없음). 마지막으로, 지미 닐슨의 책을 아직 확인하지 않았다면 아직 지역 대학 스택에서 픽업하십시오. C#에 예제가 있으며 훌륭한 읽기입니다.

BTW, Patrick 나는 Poco를 라이프 스타일 기사로 읽었고, 나는 완전히 동의합니다. 그것은 환상적인 기사입니다. 실제로 제가 추천 한 지미 닐슨 책의 섹션입니다. 나는 그것이 온라인에서 구할 수 있다는 것을 몰랐다. 그의 책은 실제로 POCO / DTO / Repository / 및 기타 DDD 개발 관행에서 찾은 최고의 정보 소스입니다.

Poco는 단순히 외부 프레임 워크에 의존하지 않는 객체입니다. 그것은 평범합니다.

Poco가 행동을 가지고 있는지 여부는 중요하지 않습니다.

DTO는 도메인 객체 (일반적으로 행동이 풍부 할 것임)와 같이 poco 일 수 있습니다.

일반적으로 DTO는 일반적으로 시스템의 경계에서 종료되는 직렬화 목적으로 외부 프레임 워크 (예 : 속성)에 종속성을 취할 가능성이 높습니다.

일반적인 양파 스타일 아키텍처 (종종 광범위하게 DDD 접근법에 사용)에서 도메인 층은 중앙에 배치되므로 해당 객체는 해당 레이어 외부의 종속성을 가져서는 안됩니다.

나는 그 주제에 대한 기사를 썼습니다. DTO 대 값 객체 대 POCO.

요컨대 :

  • dto! = 값 객체
  • dto ⊂ poco
  • 가치 객체 ⊂ poco

DTO가 Poco가 될 수 있다고 생각합니다. DTO는 객체의 사용에 관한 것이고 Poco는 객체의 스타일에 더 가깝습니다 (건축 개념에서 분리).

POCO가 DTO와 다른 점이있는 한 예는 도메인 모델/비즈니스 로직 모델 내부의 POCO에 대해 이야기 할 때 문제 도메인의 멋진 OO 표현입니다. 전체 애플리케이션에서 POCO를 사용할 수 있지만 지식 유출이 발생할 수없는 부작용이 발생할 수 있습니다. DTO는 예를 들어 UI가 통신하는 서비스 계층에서 사용되며 DTO는 데이터의 평평한 표현이며 UI에 데이터를 제공하고 서비스 계층으로 다시 변경하는 데만 사용됩니다. 서비스 계층은 DTO의 두 가지 방법을 POCO 도메인 개체에 매핑하는 것을 담당합니다.

업데이트 마틴 파울러 말했다 이 접근법은 취할 수있는 무거운 길이며 도메인 계층과 사용자 인터페이스 사이에 상당한 불일치가있는 경우에만 취해야합니다.

DTO의 기본 사용 사례는 웹 서비스에서 데이터를 반환하는 것입니다. 이 경우 Poco와 DTO는 동일합니다. POCO의 모든 동작은 웹 서비스에서 반환 될 때 제거되므로 행동이 있는지 여부는 중요하지 않습니다.

일반 규칙은 다음과 같습니다. DTO == 악 및 과도한 엔지니어링 소프트웨어의 지표. poco == 좋아요. '엔터프라이즈'패턴은 Java Ee 세계에서 많은 사람들의 뇌를 파괴했습니다. .NET Land에서 실수를 반복하지 마십시오.

DTO 클래스는 다른 소스에서 데이터를 직렬화/사형화하는 데 사용됩니다. 소스에서 객체를 사로 잡으려면 외부 소스가 중요하지 않습니다 : 서비스, 파일, 데이터베이스 등은 그 일부만 사용하고 싶을 수도 있지만 해당 데이터를 쉽게 사용하는 방법을 원할 수도 있습니다. 물체. 그런 다음 해당 데이터를 사용하려는 xmodel에 복사합니다. 시리얼 라이저는 DTO 객체를로드하는 아름다운 기술입니다. 왜요? 객체를로드 (deserialize)하기 위해 하나의 기능 만 있으면됩니다.

TL;박사:

DTO 설명한 패턴의 상태로 전송합니다.POCO 아무것도 설명하지 않습니다.그것은 또 다른 방법을 말하는"object"에 OOP.그것은에서 온 POJO(Java),에 의해 만들어 낸 Martin Fowler 는 그대로 그냥 그것을 설명으로 애호가의 이름을'object'기 때문에'object'지 않습니다.

DTO 개체인 패턴을 전송하는 데 사용되는 상태 레이어 사이의 관심사입니다.그들은 있을 수 있는 행동을(즉할 수 있는 기술적으로 poco)그래서는 동작하지 않는 변형은 상태입니다.예를 들어,그것은 있을 수 있는 방법 자체를 직렬화.

POCO 은 일반 객체지만,무엇을 의미하는'보통'되지 않는다는 특별하다.그것은 단지 그것의 CLR 개체없이 묵시적이다.일반적인 용어입니다.그렇지 않은 함께 작동하도록 만들이 일부 다른 framework.그래서 만약 당신의 POCO 가 [JsonProperty] EF 장식을 통해 모든 그의 속성,예를 들어,다음은 내가 주장되지는 않는다 POCO.

여기에 몇 가지 예를 다른 종류의 개체 패턴 비교하기:

  • View 모델:사용되는 모델링 데이터에 대한 보기입니다.일반적으로는 데이터 주석을 돕기 위해 바인딩 및 유효성 검사를 수행합니다.에된 이,그것은 또한 역할을 합 컨트롤러입니다.그것보다 더 DTO
  • 값을 객체:값을 나타내는 데 사용됩
  • 집계 루트:사용되는 상태를 관리하고 invariants
  • 핸들러:하는 데 사용되는 이벤트에 응답 메시지/
  • 특성:로 사용되는 장식과 거래하는 간단 문제
  • 서비스:을 수행하는 데 사용되는 복잡한 작업
  • 컨트롤러:을 제어하는 데 사용 흐름의 요청 및 응답
  • Factory:를 구성하는 데 사용 및/또는 조립하는 복잡한 물체에 대한 사용할 때 생성자를 충분하지 않습니다.또한 결정을 내리는 데 사용하는 개체를 만들어야 합니다.
  • 저장소/DAO:액세스하는 데 사용되는 데이터

이들은 모두 단체,그러나 통보하는 그들의 대부분은 일반적으로 묶여 있는 패턴이 있습니다.할 수 있도록 그들을 부를"개체"또는 당신은 수정에 대해 그 의도와 그것에 의한 것입니다.이것은 또한 우리는 디자인 패턴을 설명하는 복잡한 개념에서 몇 가지 작동합니다.DTO 은 패턴이다.통는 패턴,모델을 볼 패턴(예:MVC&된 이).POCO 지 않습니다.

POCO 은 설명하지 않는 패턴이 있습니다.그것은 단지 다른 방법을 참조하는 클래스/객체에 OOP.생각은 그것의 추상적인 개념으로;그들은 언급 수 있습니다.IMO,거기에 하나의 관계에서만하기 때문에 한 번체 지점에 도달 할 수있는 단 하나의 목적을 깨끗하게,그것은 더 이상 POCO.예를 들어,일단 당신이 표시 등으로 장식을 사용하여 작동하도록 일부 프레임워크,그것은 더 이상 POCO.따라서:

  • DTO 은 POCO
  • POCO 지 않 DTO
  • View 모델 POCO
  • POCO 지기 모델

점 만들기에 사이의 차이는 유지에 대한 패턴이 명확하고 일관된 노력하지 않는 십자가 관심과 지도 단단히 연결할 수도 있습니다.예를 들어,당신은 사업체가 있는 방법을 변형 상태이지만,또한 장식과 지옥 EF 장식한 SQL 서버 및 JsonProperty 할 수 있도록 다시 전송을 통해 API 엔드포인트가 있습니다.는 객체의 유제품을 변경하는 것으로 뒤덮 개의 속성(예:UserId,UserPk,UserKey,UserGuid,일부로 그들이 최대 저장되지 않을 DB 와 다른 사람을 표시하지 않는 직렬화할 JSON 으로서의 API 를 끝점).

그래서 만약 당신이 내게 뭔가를 말했 DTO,그때 나는 아마 확인 그것은 결코 이외의 용도로 사용될 이동 상태다.당신이 뭔가를 말했었기 모델,그리고 아마도 만들지 않을 얻는 데이터베이스에 저장됩니다.당신이 뭔가를 말했었 도메인이 모델,그리고 아마 그것이 확인 했다 의존성이 없고 아무것도에 대한의 외부 도메인에 있습니다.하지만 경우에 당신은 뭔가가 나에게 말했었 POCO 지 않을 정말 말이 많다.

그들을 dtos라고 부르지 마십시오. 그들은 호출됩니다 모델....기간. 모델에는 행동이 없습니다. 누가이 멍청한 용어 DTO를 생각해 냈는지 모르겠지만 .NET 일은 내가 알아낼 수있는 전부입니다. MVC의 뷰 모델을 생각해보십시오. 동일한 댐 **, 모델은 계층 서버 측 또는 와이어 기간 동안 상태를 전송하는 데 사용되며 모든 모델입니다. 데이터가있는 속성. 이들은 와이어를 통과하는 모델입니다. 모델, 모델 모델. 그게 다야.

어리석은 용어 DTO가 우리 어휘에서 멀어지기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top