0

모든 가이드 및 자습서에서 설명한대로 저장 프로 시저를 사용하여 DAL에서 objectDataSource 사용자 지정 페이징을 구현했지만 사용자 정의 페이징 논리를 데이터 액세스 계층에서 사용하면 도메인 모델을 사용할 수있는 양이 제한됩니다.ObjectDataSource에 대한 BLL (저장 프로 시저가 아님)에서 사용자 정의 페이징 논리 구현

예를 들어 특정 Office (OfficeId)에 속한 모든 고객 (CustomerId)과 해당 주문 (OrderId)의 상태를 표시하려는 gridview가있는 webform이 있습니다.

ObjectDataSource를 경우 SelectMethod : (이 DDD에 올 때 그래서이 디자인은 크지 않다 확신하지만, 나와 함께 곰 나는 안돼서)

그래서 내 서비스 계층에서 내가 같은 DTO 목록을 채울 수 에 묶여 :

public List<CustomerAndOrderDTO> GetCustomersByOffice(int officeId, int startPageIndex, int maxiumRows) 
{ 
    List<CustomerAndOrderDTO> customerAndOrderDTO = null; 
    List<Customer> customers = Customer.GetCustomersByOffice(int officeId); 
    foreach (Customer customer in customers) 
    { 
     customerAndOrderDTO.Add(new CustomerAndOrderDTO(customer)); 
    } 
    return customerAndOrderDTO; 
} 

그리고 이것은 DTO 클래스입니다 :

public CustomerAndOrderDTO 
    { 
     public int OrderId {get; set;} 
     public int CustomerId {get; set;} 

     public CustomerAndOrderDTO(Customer customer) 
     { 

      CustomerId = customer.Id; 
      Order order = customer.GetOrder(); 
      OrderId = order.Id; 
     } 
    }  

아주 간단한 코드와 도메인 모델 플러스 검증 및 지속성 checki의 모든 유연성과 힘을 얻을 BLL에 머무르는 동안.

도메인에서 개체를 집계 할 때의 이점을 무시하고 select *와 같은 저장 프로 시저 수준에서 데이터를 결합하려는 경우에도 주문을 왼쪽으로 가져 오기 ...에서 왼쪽에 가입 Office on ... where .... 당신은 CustomersOrdersByOfficePaged, CustomersOrdersByAccountDatePaged 등과 같은 모든 가능한 조합을위한 페이징을 구현하는 백만 가지 확장 메서드를 작성하게 될 것입니다 ...

그래서 나는 잘못 시작하고 있습니까? 아니면 서비스 계층의 페이징이 의미가 있습니까? 그렇다면 어떻게 구현합니까?

답변

0

큰 그림처럼 이것이 최상의 아키텍처는 아니지만 서비스 수준에서 페이징을 구현하려면 데이터 액세스 수준에서 개체를 쿼리 한 다음 페이징 논리를 구현할 수 있습니다. 지금처럼 BLL 수준에서 개체 목록 다음 ObjectDataSource를에 필요한

if ((startRowIndex != 0 && startRowIndex != null) 
     && (maximumRows != 0 && maximumRows != null)) 
     { 
      if ((audits.Count - startRowIndex) < maximumRows) 
      { 
       audits = audits.GetRange((int)startRowIndex, audits.Count - (int)startRowIndex); 
      } 
      else 
      { 
       audits = audits.GetRange((int)startRowIndex, (int)maximumRows); 
      } 
     } 
     return audits; 

카운트 방법은 기본 "오기"방법과 같은 매개 변수를 다음 방법을 "가져 오기"를하면 .Count를 반환 호출합니다.

다시 말하지만 가장 좋은 방법은 아니지만 작업을 완료합니다.