페이징, 주문 및 사전 선택 결과 (데이터베이스 단위 : dto에 포함 된 열)와 같은 일부 쿼리 가능 끝점을 제공하려는 웹 API가 있습니다. 지금까지는 많은 일들이 진행되고 있지만 기술적 인 부분이 많은 컨트롤러 메소드가 많이 있습니다. 요구 사항을 쉽게 해결할 수 있을지 궁금합니다. 종종 같은 모양 많은 엔티티쿼리 가능한 웹 API
public HttpResponseMessage GetEntities(int page = MaximumPageIndex,
int pageSize = MinimumPageSize,
string orderBy = null,
[FromUri] EntitySearchCriteria criteria = null)
{
// ensure that page/pageSize lies within possible boundaries
page = page.ToMinimum(MinimumPageIndex);
pageSize = pageSize.ToBounds(MinimumPageSize, MaximumPageSize);
// create any criteria for entity if none is available
criteria = criteria ?? new AnyEntitySearchCriteria();
// create ordering expressions based on string
var orderOptions = orderBy != null
? ExpressionBuilder.CreateSelector<Entity, dynamic>(orderBy)
: ExpressionBuilder.CreateSelector<Entity, dynamic>("Id");
// create paging options
var pagingOptions = new PagingOptions<Entity, dynamic>(page, pageSize, orderOptions);
try {
// get total count from database
var totalCount = _repository.Count();
// get entities by criteria specification (IMemberSpecification<T, TMember>)
var results = _repository.GetEntitiesByCriteria(criteria,
x = new BlablaDto {} // apply result selectors (not shown in example,
// map to paged list
pagingOptions).ToPagedList(page, pageSize, totalCount);
// create "paged" response with paging http headers (rfc 5988)
return Request.CreatePagedResponse(HttpStatusCode.OK, results);
...
}
이, 물론, 또 다시, :
일반적인 컨트롤러처럼 보인다. 이제는 Microsoft OData가 있다는 것을 알고 있습니다. 그러나 IQueryable, 이상한 응답에서만 작동합니다 (예 : 페이징 데이터가 HTTP 헤더가 아닌 json 결과에 포함됨). 그렇다면 컨트롤러를 간단하게 유지하고이 작업을 위해 코드 반복을 줄일 수있는 방법은 무엇입니까?
답변은 _repository가 어떻게 설계되고 구현되는지에 달려 있습니다 ... 코드에서 볼 수 없습니다. –
@Werlang 기본 CRUD와 ISpecification을 취하는 GetEntities() 메서드, 쿼리 공급자가 반환 한 기본 IQueryable에 적용되는 정렬/페이징 용 IQueryOptions 및 필드 및/또는 필드의 하위 집합을 반환하는 selector 식입니다. 또는 DTO 매핑. – xvdiff
이 Repository.GetEntities()는 기본 컨트롤러의 템플릿 메서드로 이동할 수 있습니다. Controller.GetEntities()에서이 모든 로직을 구현하고 각 특정 엔터티 유형에 대해이 특정 페치를 처리하도록 할 수 있습니다. –