2010-04-08 7 views
8

새로운 프로젝트를 시작하고 비즈니스 개체 및 데이터 액세스 등을 만드는 과정에 있습니다. 나는 모든 orms가 아닌 일반 old clr 개체를 사용하고 있습니다. 나는 두 개의 클래스 라이브러리를 만들었습니다 : 1) Business Objects - 모든 비즈니스 객체를 보유하고 있습니다.이 모든 객체는 속성과 비즈니스 규칙 만있는 경량 객체입니다. 2) 저장소 - 이것은 모든 데이터 액세스를위한 것입니다.POCO를 사용하여 지연로드가있는 저장소 패턴

대다수의 개체에는 자식 목록이 있고 내 질문은 필요하지 않으면 불필요한 정보를 가져 오지 않으므로이 값을 게으른로드하는 가장 좋은 방법입니다.

"null"인지 확인하고 자식 정보를 얻기 위해 저장소에 호출하는 경우 자식 속성에서 "get"을 사용할 때 생각했습니다. 이것은 내가 볼 수있는 것으로부터 두 가지 문제점을 가지고 있습니다 : 1) 객체는 "알고 있습니다"객체를 얻는 방법을 알지 못합니다. 2) 두 클래스 모두 Visual Studio에서 순환 종속성 오류를 발생시키는 서로를 참조해야합니다.

누구든지 내 프로젝트 레이아웃에서이 문제 또는 권장 사항을 극복하는 방법에 대한 제안 사항과 개선 할 수있는 부분이 있습니까?

감사

답변

2

제공된 답변과 추가 조사를 살펴본 후 지연로드에 대한 대리인을 사용하는 기사를 발견했습니다. 이것은 프록시를 사용하거나 NHibernate를 구현하는 것보다 간단한 솔루션을 제공했다.

여기에 기사에 대한 link이 있습니다.

0

당신의 게으른 로딩 코드가 런타임시 저장소 (Activator.CreateInstance로 또는 비슷한)를로드 한 후 반사를 통해 적절한 방법을 호출하는 경우 당신은 원형 의존성 문제를 해결 얻을 수 있습니다. 물론 리플렉션과 관련된 성능 저하가 있지만 대부분의 솔루션에서는 종종 중요하지 않습니다.

이 문제를 해결하는 또 다른 방법은 단순히 하나의 dll로 컴파일하는 것입니다. 여기서도 여전히 서로 다른 네임 스페이스를 사용하여 레이어를 논리적으로 분리 할 수 ​​있으며 다른 디렉토리를 사용하여 클래스를 구성 할 수 있습니다.

3

이렇게하려면 인터페이스 (구현에 대한 추상화)를 프로그래밍하고 가상 속성을 선언해야합니다. 그런 다음 저장소가 지연로드 될 등록 정보에 대한 프록시 오브젝트를 리턴합니다. 저장소를 호출하는 클래스는 더 현명하지 못하지만 프록시가 해당 속성 중 하나에 액세스하려고하면 프록시가 데이터베이스를 호출하고 값을로드합니다.

솔직히 말해서, 나는 자신을 구현하려고 시도하는 것이 광기라고 생각합니다. .NET의 위대한 마음에 의해 개발되고 정제 된이 문제에 대한 오랜 시간에 걸친 위대한 솔루션이 있습니다.

프록시를 수행하려면 Castle DynamicProxy을 사용하거나 NHibernate을 사용하여 프록시 (proxy) 및 지연로드 (lazy loading)를 모두 처리하도록 할 수 있습니다 (DynamicProxy 사용). 수동으로 구현 된 것보다 더 나은 성능을 보장합니다.

NHibernate는 당신의 POCOs를 엉망이게하지 않을 것입니다 - 속성도 기본 클래스도 없습니다; 프록시 생성을 허용하기 위해 구성원을 가상으로 표시하기 만하면됩니다.

ORM을 사용하여 다시 생각해 보겠습니다. 특히 게으른 로딩을 원하면 특히 그렇습니다. 당신은 당신의 POCO를 포기할 필요가 없습니다.

1

Entity Framework 4.0을 사용하는 경우 지연로드가있는 POCO에 대한 지원이 제공됩니다. &을 사용하면 데이터 액세스를위한 일반 저장소를 작성할 수 있습니다.

EF 4를 사용하는 일반 저장소 패턴에는 온라인으로 수 많은 기사가 있습니다.0

HTH.