Reputation: 31
I am new to ASP.NET and using clean architecture with MediatR. I am now wondering whether I have taken a wrong turn somewhere in my understanding here. I am a little confused right now.
Things that I am basically using:
For my understanding. I have some tables like Customer
, Order
, OrderDetail
, Products
, etc...
When I want to create an Order
, I have to add all other information as well.
I build my MediatR query like this:
public record GetAllSingleOrdersQuery : IRequest<PaginatedResult<GetAllSingleOrdersResponse>>
{
public int PageNumber { get; set; }
public int PageSize { get; set; }
public string SearchString { get; set; }
public string[] OrderBy { get; set; } // of the form fieldname [ascending|descending],fieldname [ascending|descending]...
public GetAllSingleOrdersQuery(int pageNumber, int pageSize, string searchString, string orderBy)
{
PageNumber = pageNumber;
PageSize = pageSize;
SearchString = searchString;
if (!string.IsNullOrWhiteSpace(orderBy))
{
OrderBy = orderBy.Split(',');
}
}
}
internal class GetAllSingleOrdersQueryHandler : IRequestHandler<GetAllSingleOrdersQuery, PaginatedResult<GetAllSingleOrdersResponse>>
{
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
private readonly IAppCache _cache;
public GetAllSingleOrdersQueryHandler(IUnitOfWork unitOfWork, IMapper mapper, IAppCache cache)
{
_unitOfWork = unitOfWork;
_mapper = mapper;
_cache = cache;
}
public async Task<PaginatedResult<GetAllSingleOrdersResponse>> Handle(GetAllSingleOrdersQuery request, CancellationToken cancellationToken)
{
Expression<Func<OrderDetail, GetAllSingleOrdersResponse>> expression = e => new GetAllSingleOrdersResponse
{
OrderDetailId = e.Id,
OrderDate = e.Order.OrderDate,
ShippingDate = e.Order.ShippingDate,
Status = e.Status.Description,
OrderDescription = e.OrderDescription,
OrderId = e.OrderId,
OrderNumber = e.Order.OrderNumber,
OrderStatus = e.Order.Status.Description,
CustomerId = e.Order.CustomerId,
CustomerNumber = e.Order.Customer.Number,
CustomerName = e.Order.Customer.Name,
OrderMechanicId = e.OrderMechanicId,
MechanicArticleNumber = e.OrderMechanic.MechanicType.ArticleNumber,
MechanicTypeId = e.OrderMechanic.MechanicTypeId,
MechanicType = e.OrderMechanic.MechanicType.Type,
SerialNoMechanic = e.OrderMechanic.SerialNoMechanic,
CustomMechanicName = e.OrderMechanic.SpecialName,
CustomMeasuringRangeMin = e.OrderMechanic.MeasuringRangeCustomMin,
CustomMeasuringRangeMax = e.OrderMechanic.MeasuringRangeCustomMax,
CustomViscosity = e.OrderMechanic.ViscosityCustom,
HorizontalMounting = e.OrderMechanic.HorizontalMounting,
ElectronicTypeId = e.OrderElectronic.ElectronicTypeId,
OrderElectronicId = e.OrderElectronicId,
ElectronicArticleNumber = e.OrderElectronic.ElectronicType.ArticleNumber,
ElectronicType = e.OrderElectronic.ElectronicType.Type,
SerialNoElectronic = e.OrderElectronic.SerialNoElectronic,
CustomElectronicName = e.OrderElectronic.SpecialName
};
var orderDetailFilterSpec = new OrderDetailFilterSpecification(request.SearchString);
if (request.OrderBy?.Any() != true)
{
var data = await _unitOfWork.Repository<OrderDetail>().Entities
.Include(od => od.Order).ThenInclude(o => o.Status)
.Include(od => od.Order).ThenInclude(o => o.Customer)
.Include(od => od.Status)
.Include(od => od.OrderMechanic).ThenInclude(om => om.MechanicType)
.Include(od => od.OrderElectronic).ThenInclude(oe => oe.ElectronicType)
.Specify(orderDetailFilterSpec)
.Select(expression)
.ProjectTo<GetAllSingleOrdersResponse>(_mapper.ConfigurationProvider)
.ToPaginatedListAsync(request.PageNumber, request.PageSize);
return data;
}
else
{
var ordering = string.Join(",", request.OrderBy); // of the form fieldname [ascending|descending], ...
var data = await _unitOfWork.Repository<OrderDetail>().Entities
.Include(od => od.Order).ThenInclude(o => o.Status)
.Include(od => od.Order).ThenInclude(o => o.Customer)
.Include(od => od.Status)
.Include(od => od.OrderMechanic).ThenInclude(om => om.MechanicType)
.Include(od => od.OrderElectronic).ThenInclude(oe => oe.ElectronicType)
.Specify(orderDetailFilterSpec)
.OrderBy(ordering)
.Select(expression)
.ProjectTo<GetAllSingleOrdersResponse>(_mapper.ConfigurationProvider)
.ToPaginatedListAsync(request.PageNumber, request.PageSize);
return data;
}
}
public partial class Order : Auditable
{
public string OrderNumber { get; set; } = null!;
public DateOnly OrderDate { get; set; }
public DateOnly ShippingDate { get; set; }
public int? StatusId { get; set; }
public virtual Status Status { get; set; } = new Status();
public int CustomerId { get; set; }
public Customer Customer { get; set; } = new Customer();
public ICollection<OrderDetail> ?OrderDetail { get; set; }
}
public partial class OrderDetail : Auditable
{
public string? OrderDescription { get; set; }
public int OrderId { get; set; }
public Order Order { get; set; } = new Order();
public int OrderMechanicId { get; set; }
public virtual OrderMechanic OrderMechanic { get; set; } = new OrderMechanic();
public int OrderElectronicId { get; set; }
public virtual OrderElectronic OrderElectronic { get; set; } = new OrderElectronic();
public int? StatusId { get; set; }
public Status Status { get; set; } = new Status();
public List<CalibrationDetail>? CalibrationDetail { get; set; }
}
public partial class OrderElectronic : Auditable
{
public string? SerialNoElectronic { get; set; }
public string? SpecialName { get; set; }
public int ElectronicTypeId { get; set; }
public string? TypeOutput { get; set; }
public ElectronicType ElectronicType { get; set; } = new ElectronicType();
}
So all entities are included in my answer, but the tables look different. Is this a good approach?
Or am I thinking too complicated here and this is created via several queries in succession?
I'm also wondering what the command should look like if you want to edit or create this data in one go?
I am little bit lost right now.
Hope someone could explain a little bit to me.
Thank you very much.
As I am new to ASP.NET, I have tried it before without MediatR. But had similar questions about how to accomplish to send a combination of commands/features to add/edit a Order with all the details.
I can't get rid of the thought that I'm thinking too complicatedly here.
Upvotes: 0
Views: 261