2013-05-14 2 views
3

저는 ServiceStack의 초보자이며 어떻게 작동하는지 배우기 위해 저장소 패턴을 사용하여 Northwind 데이터베이스 용 웹 API를 개발할 것입니다.ServiceStack 다중 서비스 웹 API

샘플 프로젝트 ServiceStack.Northwind을 확인했으며 두 가지 서비스 (고객 및 주문) 만 있습니다. 완전한 API (고객, 주문, 제품 등)를 개발하고 싶습니다. Matt Cowan has done과 같은 것입니다.

기본적으로, 모든 서비스는 작동을 위해 동일을 할 것입니다 :

  • 는 요청을받을 수 있습니다.
  • Execute (Repository.Get, Repository.Add, Repository.Update, Repository.Delete).
  • 답장을 보내주십시오.

이 때문에 거의 모든 작업을 수행 할 기본 클래스를 만들려고했습니다. 먼저 다음과 같이 시작했습니다.

public class BaseService<TRepository, TEntity, TDto> : Service 
{ 
    ... 
} 

이 클래스의 문제점은 각 작업에 대한 요청 및 응답 유형을 알 수 없다는 것입니다. 그래서 저는 타입 인자로 넘겨 줄 것이라고 생각했습니다 :

public class BaseService<TRepository, TEntity, TDto, TRequest, TSingleResponse, TCollectionResponse> : Service 
{ 
    ... 
} 

나는 이것을 좋아하지 않습니다. 클래스에 n 형식 인수를 전달하지 않고도이 작업을 수행 할 수 있습니다.

어떻게이 기본 클래스의 개발에 접근하겠습니까?.

대단히 감사합니다.

답변

2

당신은 다음과 같은 제안을 사용하여 형태 인수의 수를 줄일 수 있습니다

  • 사용 TEntity를 하나의 개체에 작업에 대한 요청/응답으로
  • 저장소 형식 인수를 피하기 위해 저장소 인터페이스 IRepository<TEntity> 선언

엔티티 (예 : FindCustomers, FindOrders)에 대한 목록을 반환하는 작업 - 각 작업에는 고유 한 검색 매개 변수가있을 것이므로 어쨌든 파생 된 클래스에서이를 구현할 수 있습니다.

public class BaseEntity 
{ 
    public int Id { get; set; } 
    // ... 
} 

public interface IRepostory<TEntity> where TEntity : BaseEntity 
{ 
    IList<TEntity> GetAll(); 

    TEntity Get(int id); 

    void Save(TEntity entity); 
    // ... 
} 

public class BaseService<TEntity, TCollectionRequest> : Service 
    where TEntity : BaseEntity 
{ 
    public IRepository<TEntity> Repository { get; set; } 

    public virtual object Get(TEntity request) 
    { 
     return Repository.Get(request.Id); 
    } 

    public virtual object Get(TCollectionRequest request) 
    { 
     return Repository.GetAll(); 
    } 

    public virtual object Post(TEntity request) 
    { 
     Repository.Save(request); 
     return request; 
    } 

    public virtual object Put(TEntity request) 
    { 
     // ... 
    } 
    // ... 
} 
+0

잘 접근 해 주셔서 대단히 감사합니다. 예제 코드에서 public'IRepository Repository {get; 세트; }'및 IoC 컨테이너가 의존성을 해결하도록합니다. – Merrin

+0

네, 맞습니다. 나는 대답을 편집했습니다. – AlexD

관련 문제