温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

asp.net core 中Service层的实现样板是怎样的

发布时间:2021-11-15 15:26:06 阅读:502 作者:柒染 栏目:大数据
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这期内容当中小编将会给大家带来有关asp.net core 中Service层的实现样板是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1. 数据表

一般情况下,我们会把用户表和登录信息表放在两个表里。为什么会这样设计呢?出于以下几种考虑:

  • 使功能分割,用户信息管理是用户管理,登录是登录

  • 增加安全,降低无关信息的查询,例如访问登录接口不会连带检索用户的普通信息,当进行用户信息管理的时候,不会把登录信息也带过来

等等

废话不多说,直接上代码:

namespace Data.Enums{    /// <summary>    /// 登录类型    /// </summary>    public enum LoginType : byte    {        /// token登录        Token,        /// 用户名密码        Password    }    /// <summary>    /// 性别    /// </summary>    public enum SexEnum    {        /// 男        Male,        /// 女        Female,        /// 隐私        None    }}
 

SysUserAuthEntity.cs

using Data.Enums;using Data.Infrastructure;namespace Data.Models{    public class SysUserAuthEntity : BaseEntity<int>    {        public string UserName { get; set; }        public string Password { get; set; }        public LoginType LoginType { get; set;}    }}
 

SysUserInfoEntity.cs

using System;using Data.Enums;using Data.Infrastructure;namespace Data.Models{    public class SysUserInfoEntity : BaseEntity<int>    {        public string NickName { get; set; }        public string ImageUrl { get; set; }        public SexEnum Sex { get; set; }        public DateTime? BirthDay { get; set; }        public int SysUserAuthId { get; set; }        public virtual SysUserAuthEntity SysUserAuth { get; set; }    }}
 

这里并没有使用数据库Sql语句作为数据库描述,而是使用了Entity类作为描述,这是因为数据库到实体类之间还是有一层转换,对于开发而言接触更多的是实体类,而不是数据表。

 

2. 生成 Repository相关

使用工具代码的方式有很多,我在这里推荐一种, Test项目中,添加一个测试类,具体代码如下:

using NUnit.Framework;using System;using System.Collections.Generic;using System.Text;using Utils.Develop;namespace Test{    public class DevelopTest    {        [Test]        public void TetDevelop()        {            var d = Develop.CurrentDirect;            Console.WriteLine(d);            Assert.IsTrue(d.Contains("template"));            var entities = Develop.LoadEntities();            foreach (var item in entities)            {                Console.WriteLine(item.FullName);            }        }        [Test]        public void TestCreateDevelop()        {            var entities = Develop.LoadEntities();            foreach (var item in entities)            {                Develop.CreateRepositoryInterface(item);                Develop.CreateRepositoryImplement(item);                Develop.CreateEntityTypeConfig(item);            }            Assert.Pass();        }    }}
 

具体的命令行执行比较麻烦,会执行所有的测试单元:

cd Test/dotnet test
 

当然了,IDE支持单个测试单元的执行,具体操作这里就不做过多的介绍了。

 

3. Service 接口和实现类

通常Service接口会提供一个简单Crud的Service接口,然后其他业务接口继承该接口。这样可以减少代码的重复,因为重复的代码在开发过程中是非常讨厌的一种情况,因为一旦一处发生变更,其他的也有可能发生变更。所以遇到重复代码一般都会进行一定程度的封装:

using System;using System.Collections.Generic;using System.Linq.Expressions;using Data.Infrastructure;namespace Service.Insfrastructure{    public interface BaseService<T>    {        T Get(object key);        T Get(Expression<Func<T, bool>> predicate);        PageModel<T> SearchPage(PageCondition<T> condition);        void Delete(Expression<Func<T, bool>> predicate);        void Update(T entity);        List<T> Search(Expression<Func<T, bool>> predicate);    }}
 

暂时就提供了这些最常见的请求方法。

在Service.Implements项目中:

using System;using System.Collections.Generic;using System.Linq.Expressions;using Data.Infrastructure;using Domain.Insfrastructure;using Service.Insfrastructure;namespace Service.Implements.Insfrastructure{    public abstract class BaseServiceImpl<T> : BaseService<T>    {        private IRepository<T> LocalRepository { get; }        protected BaseServiceImpl(IRepository<T> repository)        {            LocalRepository = repository;        }        public T Get(object key)        {            return LocalRepository.Get(key);        }        public T Get(Expression<Func<T, bool>> predicate)        {            return LocalRepository.Get(predicate);        }        public PageModel<T> SearchPage(PageCondition<T> condition)        {            return LocalRepository.Search(condition);        }        public void Delete(Expression<Func<T, bool>> predicate)        {            LocalRepository.Delete(predicate);        }        public void Update(T entity)        {            LocalRepository.Update(entity);        }        public List<T> Search(Expression<Func<T, bool>> predicate)        {            return LocalRepository.Search(predicate);        }    }}
 

这个类设置为抽象类。

 

4. 用户管理的接口

先创建了两个简单的示范接口:

using Data.Models;using Service.Insfrastructure;namespace Service{    public interface ISysUserService : BaseService<SysUserInfoEntity>    {        void Register(SysUserAuthEntity auth, SysUserInfoEntity info);        void ChangePassword(int userId, string oldPwd, string newPwd);    }}
 

实现类:

using System;using Data.Models;using Domain.Repository;using Service.Implements.Insfrastructure;namespace Service.Implements{    public class SysUserServiceImpl : BaseServiceImpl<SysUserInfoEntity>, ISysUserService    {        protected ISysUserAuthRepository AuthRepository { get; }        protected ISysUserInfoRepository InfoRepository { get; }        public SysUserServiceImpl(ISysUserAuthRepository authRepository, ISysUserInfoRepository infoRepository) : base(            infoRepository)        {            AuthRepository = authRepository;            InfoRepository = infoRepository;        }        public void Register(SysUserAuthEntity auth, SysUserInfoEntity info)        {            var authItem = AuthRepository.Get(p => p.LoginType == auth.LoginType && p.UserName == auth.UserName);            if (authItem != null)            {                throw new Exception("用户信息已经存在");            }            info.SysUserAuth = auth;            InfoRepository.Insert(info);        }        public void ChangePassword(int userId, string oldPwd, string newPwd)        {            var info = InfoRepository.Get(userId);            var auth = AuthRepository.Get(info.SysUserAuthId);            if (oldPwd == null || oldPwd != auth?.Password)            {                throw new Exception("原密码错误");            }            auth.Password = newPwd;        }    }}
 

这里没对密码进行加密处理,直接使用明文。这在正式开发中是不允许的,密码不能使用明文保存。

上述就是小编为大家分享的asp.net core 中Service层的实现样板是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/c7jie/blog/4487119

AI

开发者交流群×