2011-10-05 2 views
4

계층 (DAL, BLL & 프리젠 테이션)에서 동일한 POCO (EF4 & WCF)를 사용하고 DTO없이 수행하면 어떤 단점이 있습니까? 클라이언트와 서비스는 모두 .NET &입니다. 전체 앱이 너무 크지 않습니다.계층에서 POCO + Entity Framework를 사용하고 데이터 전송 객체를 사용하지 않는 경우 단점이 있습니까?

서로 다른 형식의 계층간에 동일한 데이터를 이동하고 변환 및 매핑을 수행하는 것이 번거 로움처럼 보이기 때문에이 질문을 던지십시오. &은 복잡성을 더합니다. &을 개발하고 유지하는 데 시간이 많이 걸리므로 오류가 발생하기 쉽습니다. 런타임 중에 DTO가 생성되거나 DTO 생성기가 사용 되더라도 DTO를 추가할만한 가치가 있는지 확신 할 수 없습니다.

& 코드를 새 웹 응용 프로그램으로 디자인하기 시작 했으므로 몇 가지 의견을 제시하고자합니다.

+1

"나는 몇 가지 의견을보고 싶습니다 ..."나는 이것을 표시하지 않을 것이지만이 질문은 "프로그래머"에 있어야하며 스택 오버플로가 아니어야합니까? – wllmsaccnt

+0

그렇지 않을 수도 있지만 그렇게하겠습니다. – cadrell0

+0

나는 아직도 stackoverflow에 속해 있고 프로그래머에 속한 것이 무엇인지 잘 모릅니다 :-) –

답변

3

DTO를 사용하는 주된 동기 중 하나는 전선을 통해 객체 표현을 전송해야한다는 것입니다.

도메인 모델 개체를 단일 프로세스 내에서 사용하는 경우 동일한 개체를 사용하는 것이 좋습니다.

개체를 직렬화하여 다른 프로세스로 보내려는 경우 (예 : 웹 서비스를 통해 두 프로세스간에 data contracts에 동의 한 DTO를 사용하여이 작업을 수행하는 것이 일반적입니다. Data annotations은이 계약상의 계약을 풍부하게하는데 사용될 수 있습니다. 두 프로세스 모두 잠재적으로 동일한 데이터 계약 어셈블리를 사용하여 다시 직렬화 및 역 직렬화 할 수 있습니다. 이러한 아키텍쳐의 각 프로세스는 상이한 목적 (즉, 분리)을 가지기 쉽고, 따라서 오브젝트들과 상이한 요건들을 가질 것이다. 하나는 프리젠 테이션에만 관련된 GUI 일 수 있고, 하나는 비즈니스 규칙을 준수하면서 상호 작용할 수 있도록 객체를 변경시키는 것과 관련된 비즈니스 로직 레이어 일 수 있고, 다른 하나는 지속성에만 관련된 데이터 액세스 레이어 일 수 있으며 다른 하나는 비정규 기가 될 수 있습니다 보고 엔진에 대한 개체 변환과 관련이 있습니다.즉, 계층 간 요구 사항의 공통성은 리치 도메인 모델 객체의 동작이 아니라 데이터 표현 (DTO 또는 데이터 계약)뿐입니다. 주어진 예제에서 동작이있는 풍부한 객체를 필요로하는 유일한 계층은 비즈니스 로직 계층입니다.

DTO 's는해야 할 일이 있다면 AppDomains간에 개체 표현을 전송하는 더 좋은 방법 일 수도 있습니다.

1

전선을 통해 데이터가 전선을 통해 볼 수 있음을 의미합니다.

사용자가 성공적으로 인증되면 모든 네트워크 도구에서 전달 된 모든 데이터를 표시 할 수 있습니다. 전체 엔티티를 전달하고 UI의 엔티티 과거 만 표시하면 사용자가 숨겨진 데이터를 볼 수 없다는 가정하에 있습니다. 그러나 모든 네트워크 추적 도구를 사용하면 모든 것이 표시됩니다.

실제로 완전한 데이터를 보내고 UI는 단지 프레젠테이션 일뿐입니다.

사용자가 네트워크 추적을 통해 데이터를 볼 수 있으면 걱정할 것이 없습니다.

하지만 나쁜 의도가있는 일부 사용자는 데이터를 조작하려고 시도 할 수 있으며 사용자가 사용자가 액세스 할 수 없다고 생각하면 무시했을 수 있음을 기억하십시오. 예를 들어, 사용자 이름 읽기 전용 필드를 만들 수 있습니다. ui는 사용자가 수정할 수 없지만 누군가가 wcf 클라이언트 코드를 작성하여 서비스에 연결할 수 있습니다.

외래 키로 인해 대부분의 문제가 발생합니다. 누군가 외래 키를 조작하면 개체 소유권을 확인하기가 어려울 수 있습니다.

유선상의 모든 요청은 유해하며 모든 가능성에 대해 보안을 검사해야한다고 가정해야합니다.

1

단점은 시작하기 만하면되는데, UI 디자이너가 간단하고 무죄 한 질문에 온다고 상상해보십시오. 엔티티가 그려지는 곳의 x와 y 위치를 엔티티 자체의 화면에 저장할 수 없습니까? 현재 선택되어 있는지 여부를 지정하는 엔터티에 "Selected"속성을 가질 수 있습니까? 그리고 당신은 생각합니다 : Selected 속성, 지옥 안돼! 나는 그것을 데이터베이스에 쓸 수는 없지만 이해가되지 않습니다. 그리고 나서 그들은 당신의 POCO가 INotifyPropertyChanged을 구현하고 커스텀 이벤트를 얻고 싶어합니다.

DTO와 매핑의 장점은 레이어를 분리하는 것입니다. 각 레이어의 요구 사항에 맞게 개체를 사용자 지정할 수있는 기능이 향상되었습니다.

요즘에는이 작업을 매우 쉽게 만들어주는 깔끔한 매핑 도구가 있습니다. AutoMapper이 그 중 하나입니다. T4 템플릿이 포함 된 Codegeneration은 다른 템플릿입니다.

관련 문제