문제

Blogentries (Blogentry 유형의 개체가 포함 된)라는 속성이있는 블로그라는 클래스가있는 도메인 모델이 있다고 가정 해 봅시다. 두 개의 테이블 "블로그"와 "Blogentry"가있는 데이터베이스 모델이 있다면 블로그에 1000 개의 블로그 항목이있는 것은 불가능하지 않습니다. 웹 사이트에 블로그를 보여 주려면 한 번에 20 개의 블로그 항목 만 표시하고 싶으므로 일종의 페이징을 사용해야합니다. 나는 분명히 DB에서 1000 개의 레코드를 가져 오기를 원하지 않습니다.

어떻게할까요? Blogentries 속성이 블로그 도메인 개체에 있어야합니까, 아니면 호흡기에 있어야합니까? 나는 여전히 블로그 항목을 추가하고 기존의 페인트 결과를 얻을 수있는 가능성을 갖고 싶습니다. nhibernate 매핑은 어떻게 생겼습니까?

블로그/블로그 엔트리는 단지 예일 뿐이며, 고객/주문 예제 또는 기타 마스터/세부 시나리오 일 수도 있습니다.

저를 깨달으십시오!

도움이 되었습니까?

해결책

나는 자체 저장소와 함께 Blogentry를 고유 한 집계 루트로 만들 것입니다. BlogID가 주어진 모든 Blogentry에 대한 Blogentry 저장소를 쿼리하여 특정 블로그에 대한 Blogentry 인스턴스를 얻을 수 있습니다. 저장소를 구현하기위한 여러 가지 전략이 있기 때문에 그 이상 저장소에 대한 구체적인 내용을 제공 할 수 없습니다 (하나의 일반 저장소 대 다수의 별도의 파인더 메소드 대 복잡한 사양 개체 등을 취하는 것 등). 저장소의 파인더 방법은 페이징을 지원해야합니다.

public class Blog
{
    public int ID {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> FindByBlogID(
        int blogID, int pageIndex, int pageSize) 
    {
        // implementation
    }
}

또는 (Blogentry가 집계 루트로 모델링 된 블로그 엔트리를 사용하면) 블로그 클래스에 블로그 센트리 드를 추가 할 수 있습니다. 블로그 인스턴스를 얻으려면 블로그 센트리 인스턴스 자체가 블로그 인스턴스를 얻으려면 블로그 인스턴스를 제공하는 것보다 블로그 인스턴스를 블로그 클래스에 두는 것보다 낫습니다. 해당 ID를 사용하면 하위 집합을 선택하여 ID 모음을 수용하는 블로그 엔트리 저장소 메소드로 전달할 수 있습니다. 다시 말해, 페이징을 지원하기 위해 도메인에 약간의 논리가 있고 저장소에 더 일반적인 getter가 있습니다.

public class Blog
{
    public int ID {get;set;}
    public IEnumerable<int> BlogEntryIDs {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> Get(IEnumerable<int> blogEntryIDs) 
    {
        // implementation
    }
}

이 접근법에 대한 사용은 것과 같습니다

// get the second page
var entries = 
  blogEntryRepo.Get(blog.BlogEntryIDs).Skip(1 * PAGE_SIZE).Take(PAGE_SIZE);

데이터베이스에서는 각 블로그 항목마다 하나씩 여러 행을 반환합니다. (또한 하나의 데이터베이스 왕복 트립에서 모든 관련 테이블에서 모든 행을 얻기 위해 여러 결과 세트를 반환하는 것을 선호합니다. 또한 데이터베이스 페이징을 활성화하기 위해 SQL 2005의 row_version 기능을 사용합니다.)

나는 일반적인 사용법이 블로그와 관련된 금지 수량 (예 : 몇 천 이상)의 블로그 엔트리 인스턴스를 보여주지 않는 한 일반적으로 두 번째 방법을 선호합니다. 너무 많은 int의 배열은 성능과 기억에주의를 기울일 것입니다.

다른 팁

PAGED 목록을 얻으려면 자체 저장소의 Blogentry에 액세스해야합니다.

편집 : 왜 다운 보트? 이것이 틀렸습니까?

블로그 항목 모음을 위해 사용할 수 있습니다 배치 크기 기인하다. 데이터베이스에서 모든 컬렉션을 선택하지 않고 필요한 값 만 선택할 수 있습니다.

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