RESTful API에서는 다양한 목적을 제공하는 여러 서비스를 갖는 것이 일반적입니다. 모든 고유한 요청에 대해 별도의 서비스를 생성하고 싶은 유혹이 있지만 불필요한 중복과 비대해진 아키텍처로 이어질 수 있습니다. ServiceStack은 호출 의미론과 응답 유형을 기반으로 서비스 그룹화를 장려하는 다양한 접근 방식을 장려합니다.
서비스 운영(요청 DTO)은 서비스의 고유한 작업을 포착해야 합니다. 서비스이고 반환되는 DTO 유형은 엔터티 또는 데이터 컨테이너를 나타냅니다. 요청 DTO는 동작을 전달하기 위해 동사(예: "Get", "Find")를 사용해야 하는 반면, DTO 유형은 엔터티를 나타내기 위해 명사(예: "Customer", "Product")를 사용해야 합니다.
일반적인 GET 요청의 경우 ServiceStack은 응답 DTO에 ResponseStatus 속성이 필요하지 않습니다. 대신 오류가 발생하면 일반 ErrorResponse DTO가 클라이언트에서 발생하고 직렬화됩니다. 이렇게 하면 응답에 명시적인 ResponseStatus 속성이 필요하지 않습니다.
가독성과 자체 설명을 향상하려면 서비스 계약에 일관된 명명법을 사용하는 것이 좋습니다. 고유 식별자를 기반으로 단일 결과를 검색하는 서비스에 대해 "Get" 동사를 예약하세요. 여러 결과를 반환하는 검색 서비스의 경우 "찾기" 또는 "검색" 접두사를 사용하세요. 또한 요청 DTO 내에서 목적을 나타내는 명확하고 설명적인 속성 이름을 제공하십시오.
이러한 원칙을 기반으로 다음과 같은 리팩터링된 예약 제한 서비스가 제안됩니다.
[Route("/bookinglimits/{Id}")] public class GetBookingLimit : IReturn<BookingLimit> { public int Id { get; set; } } public class BookingLimit { public int Id { get; set; } public int ShiftId { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public int Limit { get; set; } } [Route("/bookinglimits/search")] public class FindBookingLimits : IReturn<List<BookingLimit>> { public DateTime BookedAfter { get; set; } }
[Authenticate] 속성을 적용하여 서비스 구현을 단순화할 수 있습니다. 각 요청 DTO 대신 서비스 클래스에 한 번. 다음 코드는 이 구현을 보여줍니다.
[Authenticate] public class BookingLimitService : AppServiceBase { public BookingLimit Get(GetBookingLimit request) { ... } public List<BookingLimit> Get(FindBookingLimits request) { ... } }
ServiceStack에 내장된 Fluent 유효성 검사 기능을 사용하여 오류 처리 및 유효성 검사를 사용자 정의할 수 있습니다. 서비스에 유효성 검사기를 삽입하는 대신 다음 줄을 사용하여 AppHost에 등록할 수 있습니다.
container.RegisterValidators(typeof(CreateBookingValidator).Assembly);
부작용이 있는 작업(예: POST/PUT)의 경우 다음과 같은 유효성 검사기를 정의할 수 있습니다. :
public class CreateBookingValidator : AbstractValidator<CreateBooking> { public CreateBookingValidator() { RuleFor(r => r.StartDate).NotEmpty(); RuleFor(r => r.ShiftId).GreaterThan(0); RuleFor(r => r.Limit).GreaterThan(0); } }
위 내용은 ServiceStack에서 효율적이고 일관된 요청 DTO를 설계하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!