2011-12-15 5 views
0

에 의해 생성되는 User 개체가 있다고합시다. User 객체는 사용중인 데이터베이스/저장소에 대해 아무것도 모릅니다 (좋은 설계라고 생각합니다).데이터베이스와 상호 작용하는 함수에 대한 모범 사례

User을 만들 때 가장 평범한 사안으로 채워 넣기만하면됩니다. 이름, 주소 등. 그러나 객체 인스턴스화 후에는 모든 사용자 인스턴스화 (여러 테이블 필요 등)에 대해 상대적으로 비싼 연산을 수행하지 않으므로 userX.getTotalDebt(), getTotalDebt() 메서드를 데이터베이스에 다시 연결해야 할 수도 있습니다. 내가 간단하게 getTotalDebt()에 일부 SQL을 삽입하거나 연관성이 매우 빠르게 증가하는 Mapper에 종속성을 다시 삽입하면됩니다.

상황이 자주 발생하기 때문에 분명히 좋은/우수 사례가 있지만 찾을 수 없거나이 문제를 완전히 잘못된 각도에서보고 있습니다.

답변

0

Usermapper에 의해 생성 된 User 개체가 있습니다. User 객체는 사용중인 데이터베이스/저장소에 대해 아무 것도 모른다 (나는 좋은 디자인이라고 생각한다).

흔히 POCO (일반 오래된 CLR 개체)라고합니다.

사용자를 만들 때 가장 평범한 사안으로 채워 넣기만하면됩니다. 이름, 주소 등

이를 달성 할 수있는 여러 가지 OR/M 레이어가 있습니다. nhibernate 또는 Entity Framework 4.1 코드 우선을 사용하십시오.

나는

은 다음 그것은 더 이상 마시고 아니라 데이터베이스에 다시 연결해야하는 방법의 userX.getTotalDebt(), getTotalDebt()를 할 수도 있습니다. 투명 프록시를 사용하는 것이 가능하지만. EF와 nhibernate 모두 이것을 지원하며 Lazy Loading이라고합니다.

이것에 대한 분명한 좋은/가장 좋은 방법은이 상황이 종종 발생 때문에, 그러나 나는 그것을 찾을 수 없거나 내가 잘못 각도에서 완전히이 문제에서 찾고 있어요,이

나는 대개 내 물건을 바보로 묶고 연결을 끊는다. 클래스를 테스트 할 수있게 만들었 기 때문에 저장소 패턴을 사용합니다 (nhibernate 또는 다른 orm을 사용하더라도).

저장소 클래스를 직접 사용하거나 모든 논리를 포함하는 서비스 클래스를 만듭니다. 내 응용 프로그램의 복잡성에 따라 다릅니다.

+0

그렇다면/ORM이 getTotalDebt() 메소드의 기능을 어디에서 구현 했습니까? 매퍼의 인스턴스에서, 구체적으로 - 데이터베이스의 더 많은 테이블에 참여함으로써? 왜냐하면 나는 당신이 너무 투명 프록시/게으른 로딩 방법을 싫어하는 라인 사이에서 읽었습니다. – hbogert

+0

지연로드는 데이터베이스 예외를 데이터 계층 외부로 옮기고 조심하지 않으면 많은 SQL 쿼리를 생성 할 수 있습니다. 조인을하고 전체 목록을 반환하는 것이 좋습니다. – jgauffin

+0

지금까지 통찰력을 가져 주셔서 감사합니다. 지금까지 조인 솔루션에 상당히 만족했습니다. 그러나 이것은 서로 다른 테이블을 계속해서 결합하는 일이 꽤 지루해지고 있습니다.이미 객체 생성 속도를 늦추고있는 groupby 절을 사용하기 시작했습니다. – hbogert

관련 문제