[HttpPost("create")]
public IActionResult CreateOrder(CreateOrderRequest request)
{
if (string.IsNullOrWhiteSpace(request.CustomerName))
return BadRequest("Customer name required");
var total = request.Items.Sum(i => i.Price * i.Quantity);
if (total > 10000)
return BadRequest("Total too high");
_orderRepository.Save(request);
return Ok();
}
public interface ICreateOrderUseCase
{
Task<Guid> Execute(CreateOrderDto dto);
}
public class CreateOrderUseCase : ICreateOrderUseCase
{
private readonly IOrderRepository _repo;
public CreateOrderUseCase(IOrderRepository repo)
{
_repo = repo;
}
public async Task<Guid> Execute(CreateOrderDto dto)
{
var order = new Order(dto.ProductId, dto.Quantity);
await _repo.AddAsync(order);
return order.Id;
}
}
[HttpPost("create")]
public IActionResult CreateOrder(CreateOrderRequest request)
{
var result = _createOrderUseCase.Execute(request);
return result.IsSuccess ? Ok() : BadRequest(result.Error);
}
public class CreateOrderUseCase
{
public Result Execute(CreateOrderRequest request)
{
if (request.Total > 10000)
return Result.Fail("Too expensive");
var order = new Order();
order.CustomerName = request.CustomerName;
order.Items = request.Items;
_repo.Save(order);
return Result.Ok();
}
}
public class Order
{
public static Result<Order> Create(string customerName, List<Item> items)
{
var total = items.Sum(i => i.Price * i.Quantity);
if (total > 10000)
return Result.Fail("Too expensive");
return Result.Ok(new Order(customerName, items));
}
}
public class CreateOrderUseCase
{
public Result Execute(CreateOrderRequest request)
{
var result = Order.Create(request.CustomerName, request.Items);
if (result.IsFailure)
return result;
_repo.Save(result.Value);
return Result.Ok();
}
}
public class Order
{
public void CalculateDeliveryDate()
{
var now = DateTime.UtcNow;
this.DeliveryDate = now.AddDays(3);
}
}
public void CalculateDeliveryDate(IDateTimeProvider timeProvider)
{
this.DeliveryDate = timeProvider.Now.AddDays(3);
}
var deliveryDate = _clock.Now.AddDays(3);
var order = new Order(..., deliveryDate);
public class OrderEntity // EF-модель
{
public string CustomerName;
public List<OrderItemEntity> Items;
}
public class OrderController
{
public IActionResult Create(OrderEntity entity)
{
_orderService.Create(entity); // напрямую
}
}
public IActionResult Create(OrderRequestModel model)
{
var command = _mapper.Map(model); // mapping от web к use case
var result = _useCase.Execute(command);
return result.IsSuccess ? Ok() : BadRequest(result.Error);
}
public class OrderService
{
private readonly IOrderRepository _repo;
private readonly ILogger _logger;
private readonly INotifier _notifier;
private readonly IPaymentGateway _payment;
private readonly ICourierScheduler _courier;
private readonly IWarehouseClient _warehouse;
private readonly IEmailSender _email;
// ... ещё 3-4 зависимости
public void Create(...) { }
public void Cancel(...) { }
public void Pay(...) { }
public void Notify(...) { }
public void Ship(...) { }
// ... ещё методы
}
public class CreateOrderUseCase
{
private readonly IOrderRepository _repo;
private readonly IEmailSender _email;
public Result Execute(CreateOrderRequest request)
{
var order = Order.Create(...);
_repo.Save(order);
_email.SendConfirmation(order);
return Result.Ok();
}
}