...
Services/
├── WorkOrder/
│ ├── ApiServices/
│ │ ├── WorkOrderApiService.cs
│ │ └── Interfaces/
│ │ └── IWorkOrderApiService.cs
│ ├── ValidationServices/
│ │ ├── WorkOrderValidationService.cs
│ │ └── Interfaces/
│ │ └── IWorkOrderValidationService.cs
│ └── MapperServices/
│ ├── WorkOrderMapperService.cs
│ └── Interfaces/
│ └── IWorkOrderMapperService.cs
- Constructor Dependency Injection
public class WorkOrderApiService : IWorkOrderApiService
{
private readonly DatabaseContext _dbContext;
private readonly IWorkOrderValidationService _workOrderValidationService;
private readonly IWorkOrderMapperService _workOrderMapperService;
private readonly IHttpClientFactory _httpClientFactory;
public WorkOrderApiService(
DatabaseContext dbContext,
IWorkOrderValidationService workOrderValidationService,
IWorkOrderMapperService workOrderMapperService,
IHttpClientFactory httpClientFactory)
{
_dbContext = dbContext;
_workOrderValidationService = workOrderValidationService;
_workOrderMapperService = workOrderMapperService;
_httpClientFactory = httpClientFactory;
}
}
- Async/Await Pattern
All service methods must be asynchronous:
// ✅ Good - Consistent async pattern
public async Task<WorkOrderFormResponse?> CreateWorkOrder(WorkOrderCreateRequest request)
{
await _workOrderValidationService.ValidateRegistrationRequest(request.RegistrationCreateRequest);
var workOrder = await _workOrderMapperService.MapperWorkOrder(request.RegistrationCreateRequest);
_dbContext.WorkOrder.Add(workOrder);
await _dbContext.SaveChangesAsync();
return await GetWorkOrderForm(workOrder.ID);
}
// ❌ Bad - Mixing sync and async
public WorkOrderFormResponse CreateWorkOrder(WorkOrderCreateRequest request)
{
var result = ValidateRegistrationRequest(request.RegistrationCreateRequest).Result;
// Causes deadlocks and blocking
}