I've been refactoring code today, try to implement a clean code setup using repositories. Is this on track? Can any improvements be made?
public class IndexModel : PageModel
{
private readonly MembershipFormRepository _membershipFormRepository;
private readonly IMembershipFormViewModelService _membershipFormViewModelService;
public IndexModel(IMembershipFormViewModelService membershipFormViewModelService, MembershipFormRepository membershipFormRepository)
{
_membershipFormViewModelService = membershipFormViewModelService;
_membershipFormRepository = membershipFormRepository;
}
[BindProperty]
public MembershipFormViewModel MembershipFormModel { get; set; } = new MembershipFormViewModel();
public async Task OnGetAsync()
{
MembershipFormModel = await _membershipFormViewModelService.GetViewModel();
}
public async Task<IActionResult> OnPostAddMemberAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
await _membershipFormRepository.AddMember(MembershipFormModel);
return RedirectToPage("Index");
}
}
MembershipFormViewModelService
public class MembershipFormViewModelService : IMembershipFormViewModelService
{
private readonly MembershipContext _context;
private readonly MembershipFormRepository _membershipFormRepository;
public MembershipFormViewModelService(MembershipContext context, MembershipFormRepository membershipFormRepository)
{
_context = context;
_membershipFormRepository = membershipFormRepository;
}
public async Task<MembershipFormViewModel> GetViewModel()
{
var viewModel = new MembershipFormViewModel()
{
Titles = await SetTitlesDropDown(),
};
return viewModel;
}
private async Task<IEnumerable<SelectListItem>> SetTitlesDropDown()
{
var titlesList = new List<SelectListItem>();
var titles = await _membershipFormRepository.GetTitles();
titlesList.AddRange(titles.Select(title => new SelectListItem() {
Value = title.TitleId.ToString(),
Text = title.Title
}));
return titlesList;
}
}
IMembershipFormViewModelService
public interface IMembershipFormViewModelService
{
Task<MembershipFormViewModel> GetViewModel();
}
MembershipFormRepository
public class MembershipFormRepository : IMembershipFormRepository
{
private readonly MembershipContext _context;
private readonly IMapper _mapper;
public MembershipFormRepository(MembershipContext context, IMapper mapper)
{
_context = context;
_mapper = mapper;
}
public async Task<IEnumerable<Title>> GetTitles()
{
return await _context.Title.ToListAsync();
}
public async Task AddMember(MembershipFormViewModel membershipForm)
{
var membership = new Membership();
membership = _mapper.Map(membershipForm, membership);
_context.Membership.Add(membership);
await _context.SaveChangesAsync();
}
}
IMembershipFormRepository
public interface IMembershipFormRepository
{
Task<IEnumerable<Title>> GetTitles();
Task AddMember(MembershipFormViewModel membershipForm);
}