在很多时候架构上是业务层和控制器分开的 那么业务层也会承担的增删改查的业务 如果是每次在调用仓储层在写一套同样的CRUD 在代码层面有一些冗余 所以写了一套类似ABP 的基类Service 方法
首先新建接口 IBaseService<Models,ViewModel,key>
这是一个泛型接口 Models 代表 实体 ViewModel 可以理解为 DTO Key 代表主键
泛型的设计可以根据自己系统的业务和特点进行重新考虑 可以和我这不一样 更多的是思考怎么解放双手.
public interface IBaseService<Models,ViewModel,key>
{
// ExecuteResult 是返回值统一实体 对应上自己项目的
// IPagedList 是分页实体
Task<ExecuteResult<Models>> ModelCreate(Models viewModel);
Task<ExecuteResult> ModelUpdate(Models viewModel);
Task<ExecuteResult> ModelDelete(key Uid);
Task<ExecuteResult<Models>> Select(key id);
Task<ExecuteResult<IList<Models>>> Select(Expression<Func<Models, bool>> expression);
Task<ExecuteResult<IPagedList<Models>>> SelectPage(int page = 1, int limit = 10);
Task<ExecuteResult<IPagedList<Models>>> SelectPage(Expression<Func<Models, bool>> expression, int page = 1, int limit = 10);
}
新建实现类 BaseService
public class BaseService<Models,ViewModel,key>: IBaseService<Models, ViewModel,key> where Models : class{
// 这里是从基类这里进行一个注入一些常用的对象 我这里是三个
public BaseService(IUnitOfWork<Context> unitOfWork, IJwtUtils jwtUtils, IMapper mapper)
{
// 工作单元
_unitOfWork = unitOfWork;
// jwt
_jwtUtils=jwtUtils;
// AutoMapper
_mapper=mapper;
}
... 剩余就是继承实现CRUD 操作 这里的CRUD 就是CRUD 就可以做一些简单的重复验证 剩余的全部交个业务层
}
用户Service
public interface IUserService:IBaseService<SystemUser, UserViewModel, long>{
Task<ExecuteResult<SystemUser>> Create(UserViewModel viewModel)
// C R U D 但是昨晚基本业务验证后 就直接调用父类的方法 就省去一直写 c r u d 操作 在配上上一些实体验证应该就没啥了
}
public class UserService : BaseService<SystemUser,UserViewModel,long>, IUserService{
public async Task<ExecuteResult<SystemUser>> Create(UserViewModel viewModel)
{
ExecuteResult<SystemUser> executeResult = new ExecuteResult<SystemUser>();
// 验证用户 是否存在
viewModel.RoleId = 1569607246961315841;
if (viewModel.checkUserexit(_unitOfWork))
{
executeResult.SetFailMessage("账户或邮箱已存在 请重新输入!");
return executeResult;
}
if(!viewModel.checkUserRolesAsync(_unitOfWork)) {
executeResult.SetFailMessage("用户角色异常 请重新创建!");
return executeResult;
}
// 进行转换
SystemUser systemUser=_mapper.Map<SystemUser>(viewModel);
systemUser.Id=NextId();
systemUser.CreateTime = DateTime.Now;
systemUser.Creator =_jwtUtils.GetCurrentUserInfo().Id;
return await base.ModelCreate(systemUser);
}
}