From ef163726a5444ba0cbc631f74730184172c1c486 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 13 May 2021 15:05:53 +0300 Subject: Implemented BaseService that uses generics to implement very basic CRUD; Moved away from 3 service model to 1 service model in add feature script --- ExamTemplate/Services/Interfaces/IBaseService.cs | 21 ++++++ ExamTemplate/Services/Interfaces/IUserService.cs | 4 +- .../Services/Models/User/EditUserServiceModel.cs | 9 --- ExamTemplate/Services/Services/BaseService.cs | 81 ++++++++++++++++++++++ ExamTemplate/Services/Services/UserService.cs | 8 +-- .../Web/Configurations/ControllerUserMappings.cs | 2 +- ExamTemplate/Web/Controllers/AccountController.cs | 4 +- 7 files changed, 110 insertions(+), 19 deletions(-) create mode 100644 ExamTemplate/Services/Interfaces/IBaseService.cs delete mode 100644 ExamTemplate/Services/Models/User/EditUserServiceModel.cs create mode 100644 ExamTemplate/Services/Services/BaseService.cs (limited to 'ExamTemplate') diff --git a/ExamTemplate/Services/Interfaces/IBaseService.cs b/ExamTemplate/Services/Interfaces/IBaseService.cs new file mode 100644 index 0000000..55500ff --- /dev/null +++ b/ExamTemplate/Services/Interfaces/IBaseService.cs @@ -0,0 +1,21 @@ +using System; +using System.Threading.Tasks; +using System.Collections.Generic; + +namespace ExamTemplate.Services.Interfaces +{ + public interface IBaseService + where DbModel : class + where ServiceModel : class + { + Task CreateAsync(ServiceModel serviceModel); + + Task GetByIdAsync(Guid id); + + Task> GetAll(); + + Task EditAsync(ServiceModel serviceModel); + + Task DeleteAsync(Guid id); + } +} diff --git a/ExamTemplate/Services/Interfaces/IUserService.cs b/ExamTemplate/Services/Interfaces/IUserService.cs index 7f4c26f..35f14e3 100644 --- a/ExamTemplate/Services/Interfaces/IUserService.cs +++ b/ExamTemplate/Services/Interfaces/IUserService.cs @@ -1,8 +1,6 @@ using System.Security.Claims; using System.Threading.Tasks; using ExamTemplate.Services.Models.User; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; namespace ExamTemplate.Services.Interfaces { @@ -18,7 +16,7 @@ namespace ExamTemplate.Services.Interfaces Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal); - Task EditUserAsync(ClaimsPrincipal claimsPrincipal, EditUserServiceModel editUserServiceModel); + Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel); Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal); diff --git a/ExamTemplate/Services/Models/User/EditUserServiceModel.cs b/ExamTemplate/Services/Models/User/EditUserServiceModel.cs deleted file mode 100644 index c8b9971..0000000 --- a/ExamTemplate/Services/Models/User/EditUserServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ExamTemplate.Services.Models.User -{ - public class EditUserServiceModel - { - public string FirstName { get; set; } - public string LastName { get; set; } - public string Username { get; set; } - } -} diff --git a/ExamTemplate/Services/Services/BaseService.cs b/ExamTemplate/Services/Services/BaseService.cs new file mode 100644 index 0000000..89b3239 --- /dev/null +++ b/ExamTemplate/Services/Services/BaseService.cs @@ -0,0 +1,81 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using ExamTemplate.Data; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using System.Linq; +using ExamTemplate.Services.Interfaces; + +namespace ExamTemplate.Services.Services +{ + public abstract class BaseService : IBaseService + where DbModel : class + where ServiceModel : class + { + protected IMapper _autoMapper { get; private set; } + protected TemplateContext _context { get; private set; } + + protected BaseService(IMapper autoMapper, TemplateContext context) + { + this._autoMapper = autoMapper; + this._context = context; + } + + public virtual async Task CreateAsync(ServiceModel serviceModel) + { + DbModel newEntity = this._autoMapper.Map(serviceModel); + + await this.GetDbSet() + .AddAsync(newEntity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task GetByIdAsync(Guid id) + { + DbModel entity = await this.GetDbSet() + .FindAsync(id); + + return this._autoMapper.Map(entity); + } + + public virtual async Task> GetAll() + { + return await this.GetDbSet() + .Select(x => this._autoMapper.Map(x)) + .ToListAsync(); + } + + public virtual async Task EditAsync(ServiceModel serviceModel) + { + DbModel entity = this._autoMapper.Map(serviceModel); + + this._context.Update(entity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task DeleteAsync(Guid id) + { + DbModel entity = this.GetDbSet() + .Find(id); + + this._context.Remove(entity); + + return await this.SaveChangesAsync(); + } + + /// Get, Create, Edit and Delete use this method + /// Override it to add include statements (and so all other methods will work with includes too) + protected virtual DbSet GetDbSet() + { + return this._context.Set(); + } + + protected async Task SaveChangesAsync() + { + return await this._context.SaveChangesAsync() >= 1; + } + } +} diff --git a/ExamTemplate/Services/Services/UserService.cs b/ExamTemplate/Services/Services/UserService.cs index dab0801..f2a3e9f 100644 --- a/ExamTemplate/Services/Services/UserService.cs +++ b/ExamTemplate/Services/Services/UserService.cs @@ -78,13 +78,13 @@ namespace ExamTemplate.Services.Services return this._autoMapper.Map(user); } - public async Task EditUserAsync(ClaimsPrincipal claimsPrincipal, EditUserServiceModel editUserServiceModel) + public async Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel) { User user = await this._userManager.GetUserAsync(claimsPrincipal); - user.UserName = editUserServiceModel.Username; - user.FirstName = editUserServiceModel.FirstName; - user.LastName = editUserServiceModel.LastName; + user.UserName = userServiceModel.Username; + user.FirstName = userServiceModel.FirstName; + user.LastName = userServiceModel.LastName; IdentityResult result = await this._userManager.UpdateAsync(user); return result.Succeeded; diff --git a/ExamTemplate/Web/Configurations/ControllerUserMappings.cs b/ExamTemplate/Web/Configurations/ControllerUserMappings.cs index 0a797af..9b798e6 100644 --- a/ExamTemplate/Web/Configurations/ControllerUserMappings.cs +++ b/ExamTemplate/Web/Configurations/ControllerUserMappings.cs @@ -12,7 +12,7 @@ namespace ExamTemplate.Services.Configurations CreateMap(); CreateMap(); CreateMap(); - CreateMap(); + CreateMap(); } } } diff --git a/ExamTemplate/Web/Controllers/AccountController.cs b/ExamTemplate/Web/Controllers/AccountController.cs index b7a1207..414304f 100644 --- a/ExamTemplate/Web/Controllers/AccountController.cs +++ b/ExamTemplate/Web/Controllers/AccountController.cs @@ -117,8 +117,8 @@ namespace ExamTemplate.Web.Controllers UserServiceModel loggedInUser = await this._userService.GetUserByClaimsAsync(HttpContext.User); - EditUserServiceModel editUserServiceModel = this._autoMapper.Map(editUserViewModel); - bool result = await this._userService.EditUserAsync(HttpContext.User, editUserServiceModel); + UserServiceModel userServiceModel = this._autoMapper.Map(editUserViewModel); + bool result = await this._userService.EditUserAsync(HttpContext.User, userServiceModel); if (result) { -- cgit v1.2.3