2012-03-14 1 views
0

저는 현재 내 응용 프로그램의 지속성 프레임 워크를 고안 중입니다 ... 그리고 추상화를위한 두 가지 해결책을 논의하고 있습니다.데이터 계층에서 올바른 추상화 양은 무엇입니까?

옵션 1. 먼저, 간단 (하지만 아마도 더 많은 데이터베이스에 결합은 2 계층 접근 방식이다.이 방식에서, 데이터 매퍼 데이터베이스에서 데이터를 끌어와 비즈니스 엔티티를 구축 할 수 있습니다.

거친 다이어그램 워크 플로우의 :

UserEntity <= UserMapper => Database 

옵션 2 두 번째, 그리고 더 유연한 (하지만 가능 과잉) 접근 방식은 3 계층 접근 방식이 방식에서, 우리는 전적으로에게 말을하는 것입니다 작업의 제 3 목적이있다. 데이터베이스를 검색하고 데이터 매퍼 (Data Mapper)에게 데이터를 보내고 누가 객체를 생성 하는지를 확인합니다.

거친 다이어그램 :

UserEntity <= UserMapper <= UserDataRetriever => Database 

는 물론 첫 번째 옵션의 장점은 간단하고 작성하는 것이 더 빠른 점이다. 두 번째 옵션의 이점은 DB (및 관련 쿼리)에 대한 DataRetriever의 연결 만 변경해야하므로 내 지속성 메서드를 변경하는 것이 더 쉽다는 것입니다.

이 사이트의 크기가 매우 빠르게 커지기 때문에 안티 패턴 랜드에 들어 가지 않고도 가장 유연한 옵션을 선택하고 싶습니다.

어느 것이 더 낫습니까?

답변

1

나는 다음을 사용합니다.

저장소 자체는 바닐라 ADO.NET과 OR/M 매퍼, 웹 서비스 또는 다른 어떤 것을 사용할 수 있습니다.

+0

응답 해 주셔서 감사합니다. -이 경우 repo는 db/w로 말하려고합니다. 엔티티 용으로 만들어진 각각의 클래스 집합입니까? 나는 그 자체에 대해서 더 자세히 연구 할 것이다. – johnnietheblack

+0

그것은 각 루트에 대해 빌드 된 클래스 세트이며 그것은 집합이다. 즉 Order + OrderLines + OrderHistory 등 하나 – jgauffin

1

음, 옵션 2의 그림은 좀 더 복잡 할 것 :

UserEntity <= UserMapper <= UserDataEntity <= UserDataRetriever => Database 

UserMapper이 때문에 UserDataEntity, 한 종류에서 다른 매핑해야합니다. UserDataRetriever에서 UserEntity으로 직접 매핑하는 것은 개념적으로 어렵습니다. 당신은 두 번째 옵션은 다음 다이어그램을 함축 될 수 있습니다 [list of arrays]/UserDataEntity <= UserDataRetriever :

UserEntity <= UserMapper <= [list of arrays] <= UserDataRetriever => Database 

어쨌든, 옵션 1UserMapper 그 자체의 기능을 포함하는 방식으로 여기 다르다.

어느 옵션도 본질적으로 우수하지 않습니다. 엔티티의 수와 지속성 및 도메인 계층 간 매핑이 얼마나 쉬운 지에 따라 다릅니다.

대신 옵션 1.5을 시도 할 수 있습니다 : 기본적인 접근 방식은 당신이)는 별도의 잘 정의 된 방법이 데이터를 검색 할 수 UserMapper을 설계 동시에 옵션 1이며, B)은 데이터를지도합니다. 이 방법을 사용하면 마른 상태에서 시작하여 필요한 경우 해당 메소드를 별도의 클래스로 리팩토링하는 쉬운 방법을 사용할 수 있습니다. 저장소가 매핑을 할 것

Entity <=> Repository pattern <=> DataSource 

(또는 내부적으로 매핑 레이어를 사용) :

+0

예, UserDataRetriever를 추가하는 것이 옳습니다.이 예제에는 포함시키지 않았지만 확실히 하나만 사용했습니다. 그리고 네, 일련의 데이터 배열을 반환합니다. 나는 당신이 제안한 1.5 옵션을 할 수 있습니다. 나는 쉽게 리팩터링 할 수있는 옵션을 좋아한다. :) – johnnietheblack