Mam projekt podzielony w następujący sposób:
- Core
- Domain
- Application
- Persistence
- Presentation
- WebApi
- Razor
- Blazor
Cała logika znajduje się w Core, wszystkie projekty z prezentacji posiadają referencje tylko do Application. Korzystam z rozdzielenia przypadków użycia na commands, queries.
Teraz przykładowo chcę stworzyć nowego klienta, więc definiuję komendę:
public class CreateCustomerCommand : IRequest<int>
{
public string Name { get; set; }
public int MembershipTypeId { get; set; }
public bool IsSubscribedToNewsletter { get; set; }
public DateTime? Birthdate { get; set; }
}
I tu pojawia się mój problem, mianowicie chcę, wybrać MembershipType z rozwijanej listy, żeby móc to zrobić w kontrolerze pobieram dostępne opcje i przesyłam je do widoku:
public class CustomersController : Controller
{
public async Task<IActionResult> Create()
{
var membershipTypes = await _mediator.Send(new GetMembershipTypesQuery());
return View(membershipTypes);
}
}
public class GetMembershipTypesQueryHandler : IRequestHandler<GetMembershipTypesQuery, IEnumerable<MembershipTypeDto>>
{
public async Task<IEnumerable<MembershipTypeDto>> Handle(GetMembershipTypesQuery request, CancellationToken cancellationToken)
{
return await _context.MembershipTypes
.Select(MembershipTypeDto.Projection)
.ToListAsync(cancellationToken);
}
}
Ale w tym przypadku nie mam do czego bindować pól z formularza, więc tworzę viewmodel:
public class CreateCustomerViewModel
{
public CreateCustomerCommand Command { get; set; }
public IEnumerable<MembershipTypeDto> MembershipTypes { get; set; }
}
public class CustomersController : Controller
{
public async Task<IActionResult> Create()
{
var membershipTypes = await _mediator.Send(new GetMembershipTypesQuery());
var vm = new CreateCustomerViewModel { MembershipTypes = membershipTypes };
return View(vm);
}
}
- Czy tworzenie viewmodeli w kontrolerze jest dobrą opcją? Początkowo myślałem, żeby je zwracać z Application ale nie wiem jak by to miało wyglądać np. dla CreateCustomerViewModel, utworzyć query, które mi zwróci vm, nie widzę w tym sensu szczególnie, że jeśli posiadam API to tam nie potrzebuję viewmodeli.
- Obecnie viewmodele znajdują się w warstwie prezentacji co powoduje, że dla każdego projektu muszę tworzyć ich kopię czy to jest dobre podejście czy może przenieść je do Application lub stworzyć nowy projekt i dzielić pomiędzy wszystkie projekty z warstwy prezentacji?