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

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

本期,边肖将为大家带来ASP.NET芯服务层的实现模式。文章内容丰富,从专业角度进行分析和描述。希望你看完这篇文章能有所收获。

00-1010通常,我们会将用户表和登录信息表放在两个表中。为什么要这样设计?原因如下:

划分功能,用户信息管理是用户管理,登录是登录。

增加安全性,减少无关信息的查询。比如访问登录界面不会联合检索用户的常用信息,在管理用户信息时也不会带来登录信息。

等等

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

命名空间数据。枚举

{

///摘要

///登录类型

////摘要

公共枚举LoginType :字节

{

///令牌登录

令牌,

///用户名和密码

密码

}

///摘要

///性别

////摘要

公共枚举

{

///男

男性,

///女性

女性,

///隐私

没有人

}

}

SysUserAuthEntity.cs

使用数据。枚举;

使用数据。基础设施;

命名空间数据。模型

{

公共类SysUserauthentity : baseEntityint

{

公共字符串UserName { get设置;}

公共字符串Password { get设置;}

public LoginType LoginType { get设置;}

}

}

SysUserInfoEntity.cs

使用系统;

使用数据。枚举;

使用数据。基础设施;

命名空间数据。模型

{

公共类SysUserInfoentity : baseEntityint

{

公共字符串昵称{ get设置;}

公共字符串ImageUrl { get设置;}

public SexEnum Sex { get设置;}

公共日期时间?生日{ get设置;}

public int SysUserAuthId { get设置;}

p

ublic 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层的实现样板是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/93986.html

(0)

相关推荐

  • XMLHttpRequest中fetch_ajax请求的新写法是什么

    技术XMLHttpRequest中fetch_ajax请求的新写法是什么这篇文章主要讲解了“XMLHttpRequest中fetch_ajax请求的新写法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小

    攻略 2021年11月5日
  • 心情低落想哭句子,有没有形容心情很低落的句子

    技术心情低落想哭句子,有没有形容心情很低落的句子1、张爱玲曾说心情低落想哭句子,孤单不是与生俱来的,而是由你爱上一个人的那一刻开始。但,在这千疮百孔、满身疲惫的夜晚,空对一身莫名的悲凉与刻骨的孤单,仍期待有人,能许我们一

    生活 2021年10月22日
  • 什么时候需要使用HTTPS代理

    技术什么时候需要使用HTTPS代理本篇文章给大家分享的是有关什么时候需要使用HTTPS代理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。HTTPS是HTTP

    攻略 2021年11月11日
  • 快递名称都有哪些,国内都有哪几家快递公司

    技术快递名称都有哪些,国内都有哪几家快递公司国内快递公司数千家,下面列举一些知名公司快递名称都有哪些。1.跨越速运跨越速运成立于2007年,是一家直营快递公司,全国有2000多家营业网点,全部由总部统一管理,监督机 制完

    生活 2021年10月23日
  • spark streaming状态操作(sparkstreaming实时处理流程)

    技术Spark Structured Streaming的高效处理RunOnceTrigger是怎样进行的Spark Structured Streaming的高效处理RunOnceTrigger是怎样进行的,相信很多没

    攻略 2021年12月17日
  • mysql安装过程中遇到问题怎么办(安装mysql最后一步不成功怎么办)

    技术mysql重新安装的疑问问题有哪些这篇文章主要介绍mysql重新安装的疑问问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!近日遇到一个问题 重新安装了一下系统,但庆幸的是mysql的安

    攻略 2021年12月21日