4つ以上のメソッドを持つサービスがある場合、実際には4つ以上のサービスクラス、4つ以上のリクエストDTO、4つ以上のレスポンスDTOを作成する必要があるとは想像できません。
4つのメソッドを持つ1つのサービスクラスは必要ありません。各メソッドはもちろんリクエストDtoを受け取り、レスポンスDtoを返します。明らかに、一部のメソッドでは、応答Dtoは必要ない場合があります
たとえば、5つのメソッドを使用する一般的なサービスは次のようになります。
public class ProductsService: Service
{
[Route("/products")]
public class GetProductsRequest: IReturn<List<ProductResponse>> {}
public class ProductResponse
{
public int Id { get; set; }
public string Name { get; set; }
}
public object Get(GetProductsRequest request)
{
IEnumerable<ProductResponse> response = ...
return response;
}
[Route("/products/{id}")]
public class GetProductRequest: IReturn<ProductResponse>
{
public int Id { get; set; }
}
public object Get(GetProductRequest request)
{
ProductResponse response = ...
return response;
}
[Route("/products")]
public class CreateProductRequest
{
public string Name { get; set; }
}
public object Put(CreateProductRequest request)
{
... create the product here
return new HttpResult { StatusCode = HttpStatusCode.Created };
}
[Route("/products/{id}")]
public class UpdateProductRequest
{
public int Id { get; set; }
public string Name { get; set; }
}
public object Patch(UpdateProductRequest request)
{
... update the product here
return new HttpResult { StatusCode = HttpStatusCode.Accepted };
}
[Route("/products/{id}")]
public class DeleteProductRequest
{
public int Id { get; set; }
}
public object Delete(DeleteProductRequest request)
{
... delete the product here
return new HttpResult { StatusCode = HttpStatusCode.Accepted };
}
}
リクエストとレスポンスのDTOをネストされたクラスとしてサービスに配置しましたが、別々のファイルに入れると読みやすくなります。
public class ProductsService: Service
{
public object Get(GetProductsRequest request)
{
IEnumerable<ProductResponse> response = ...
return response;
}
public object Get(GetProductRequest request)
{
ProductResponse response = ...
return response;
}
public object Put(CreateProductRequest request)
{
... create the product here
return new HttpResult { StatusCode = HttpStatusCode.Created };
}
public object Patch(UpdateProductRequest request)
{
... update the product here
return new HttpResult { StatusCode = HttpStatusCode.Accepted };
}
public object Delete(DeleteProductRequest request)
{
... delete the product here
return new HttpResult { StatusCode = HttpStatusCode.Accepted };
}
}