一、需求:

1、功能只有登录、注册。

二、架构:

1、分别为

UserSys.IServices:主要有实体和对实体的配置,还有对实体的操作接口

UserSys.Services :主要是对自IService层中的接口实现

UserSys.DTO :主要是我们Web层中需要什么实体就给传递什么实体

UserSys.Common:一些通用的组件封装到该类库中

UserSys.Web:Asp.Net MVC

2、Web层采用Asp.Net MVC

3、数据库访问通过EF

三、具体实现

   1、写User实体

public class User{public long Id { get; set; }public string PhoneNum { get; set; }public string PasswordHash { get; set; }public bool IsDeleted { get; set; }}

分别通过Nuget安装EF

.Net Freamwork中   Install-Package EntityFramework

.Net Core中 Install-Package Microsoft.EntityFrameworkCore.SqlServer  -Version 2.0.0   一定要写上版本号

2、对实体中的字段进行配置  UserConfig

.Net Freamwork中  UserConfig需要继承EntityTypeConfiguration<User>

    public class UserConfig : EntityTypeConfiguration<User>{public UserConfig(){this.ToTable("Users");this.Property(o => o.PhoneNum).HasMaxLength(200).IsRequired();this.Property(o => o.PasswordHash).HasMaxLength(200).IsRequired();}}

.Net Core中内置了IEntityTypeConfiguration

public class UserConfig : IEntityTypeConfiguration<User>{public void Configure(EntityTypeBuilder<User> builder){builder.ToTable("Users");builder.Property(u => u.PasswordHash).IsRequired().HasMaxLength(200);builder.Property(u => u.PhoneNum).IsRequired().HasMaxLength(200);            }}

3、封装一个MyDbContext

.Net Freamwork中我们继承自DbContext ,并重写该OnModelCreating方法

public class MyDbContext : DbContext{public MyDbContext() : base("constr")   //base中的参数为数据库的连接字符串{}protected override void OnModelCreating(DbModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//这样就得到当前运行的//这句话的意思就是  加载我们这句话所在的程序集加载所有的继承自EntityTypeConfiguration 为模型配置类。modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());}public DbSet<Users> User { get; set; }}

下面这段代码代表从这句话所在的程序集加载所有的继承自 EntityTypeConfiguration 为模型配置类

     modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());

.Net Core中 同样也是该类继承DbContext,但是需要分别重写OnConfiguring和OnModelCreating方法

public class MyDbContext:DbContext{public DbSet<Users> Users { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){base.OnConfiguring(optionsBuilder);var builder =new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())//SetBasePath设置配置文件所在路径.AddJsonFile("appsettings.json");var configRoot = builder.Build();var connString =configRoot.GetSection("db").GetSection("ConnectionString").Value;optionsBuilder.UseSqlServer(connString);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//这段代表表示,加载我们当前实体Users类所有的程序集Assembly asmServices = Assembly.Load(new AssemblyName("UserSys.Services"));            modelBuilder.ApplyConfigurationsFromAssembly(asmServices);}}

注意:

1)、 .Net Core中没有内置像EF 中的modelBuilder.Configurations.AddFromAssembly()方法 ,但是不用担心,杨老师已经给我们封装了一个和EF中相同作用的

Nuget包,我们只需要安装就行了https://www.nuget.org/packages/RuPeng.EFCore.Ext

2)、.Net  Core中的数据库连接等信息以键值对的形式是放在 json文件中的,与.Net Framework中不同,.Net Framework中是配置为Web.Config中的

4、开始写对Users类的操作接口IUserService  .Net Core和.Net FrameWork中是相同的

    public interface IUserService{void Add(string phoneNum, string password);UserDTO GetByPhoneNum(string phoneNum);bool CheckLogin(string phoneNum, string password);}

5、写实现类UserService

   public class UserService : IUserService{public void AddNew(string phoneNum, string password){using (MyDbContext ctx = new MyDbContext()){if(ctx.Users.Any(u => u.PhoneNum == phoneNum)){throw new ApplicationException("手机号已经存在");}User user = new User();user.PasswordHash = MD5Helper.Md5(password);user.PhoneNum = phoneNum;user.IsDeleted = false;ctx.Users.Add(user);ctx.SaveChanges();}}public bool CheckLogin(string phoneNum, string password){using (MyDbContext ctx = new MyDbContext()){User user = ctx.Users.SingleOrDefault(u => u.PhoneNum == phoneNum);if(user==null){return false;}string inputPwdHash = MD5Helper.Md5(password);return user.PasswordHash == inputPwdHash;}}public UserDTO GetByPhoneNum(string phoneNum){using (MyDbContext ctx = new MyDbContext()){User user = ctx.Users.SingleOrDefault(u => u.PhoneNum == phoneNum);if(user==null){return null;}return new UserDTO { Id=user.Id,PasswordHash=user.PasswordHash,PhoneNum=phoneNum};}}}

到这就剩下Web层的登录和注册了,So Easy,所以就不写具体怎么写了。

需要说下的是:依赖注入的问题:

1、.Net FrameWork中我们通过IOC对类进行注入,怎么注入自行百度,方法很多,我主要说下.Net Core中怎么注入

因为在.Net Core中已经内置了IOC 容器 ,不再需要 autofac 等,当然 autofac 也是支持.net core的( http://www.open-en.com/lib/view/open1454127071933.html)。

内置 IOC 是通过构造函数注入,而不是属性注入。

2、.Net Core中有内置的IOC有三种生命周期,我们采用Singleton 的方式注入,ingleton 生命能够周期服务在第一被请求时创建,在后续的每个请求都会使用同一个实例。

具体实现:  在Controller中使用构造函数注入(不是属性注入)

1)、首先需要在UserSys.IService层中,写一个通用的接口,该接口中不需要定义任何的方法,但是该类库中需要用到的接口都需要继承自IServiceTag接口

2)、如果我们注入单个类的话,可以直接在Startup.cs中的ConfigureServices方法中,直接这样注入

                  services.AddSingleton(typeof(IMyService),typeof(MyService)); 

但是如果我们有多个接口需要注入呢?我们需要封装一个方法来实现,就是通过我们下面的这样,通过反射来实现

public void ConfigureServices(IServiceCollection services){//Filterservices.AddMvc(options=> {options.Filters.Add(new ModelStateValidationFilter());});services.AddSession();//注册服务和实现类            Assembly asmServices = Assembly.Load("UserSys.Services");var serviceTypes = asmServices.GetTypes().Where(t => t.IsAbstract == false && typeof(IServiceTag).IsAssignableFrom(t));foreach(var serviceType in serviceTypes){var intfTypes = serviceType.GetInterfaces().Where(t => typeof(IServiceTag).IsAssignableFrom(t));foreach (var intfType in intfTypes){services.AddSingleton(intfType, serviceType);}}}

3)、在需要用到该接口的实现方法的地方,我们只需要通过构造函数的形式注入就行了

    public class HomeController : Controller{private IUserService userService;public HomeController(IUserService userService){this.userService = userService;}}

登录注册的小项目对比.Net Core与 .Net Framework的一些区别相关推荐

  1. SSM实现登录注册的小案例(手把手喂饭)

    SSM实现登录注册的小案例 温馨提示 为了您有更好的阅读体验,原文链接如下,长理小生:https://lixingweiblog.github.io/Pages SpringMVC+Spring+My ...

  2. Django写一个登录注册---001创建项目以及设计数据库

    Djanog开发小项目实践,众所周知,一个产品往往需要登录注册这些功能,所以我这里实现一下登录注册的开发. 使用pycharm(专业版)创建一个django项目,不是专业版看不到创建django的字样 ...

  3. 用户登录注册流程图-所有项目论文通用计算机毕业设计

    系统模块详细设计 (1) 用户注册 消费者必须注册才能购买商品,注册流程如图4.3所示. (2) 用户登录 输入时,用户必须输入用户名和密码.系统确认用户输入的信息.如果用户的输入不正确,则用户需要知 ...

  4. Java游戏用户登录注册_java___控制台可以实现简单的登录注册的小游戏平台

    话不多说直接上代码: package pt; import java.util.Scanner; public class Test { public static void main(String[ ...

  5. SSM整合之登录注册

    一.概述         本文以一个登录注册的小功能作为示例,对SSM框架做一个整合. 二.SSM整合 SSM框架是指Spring.SpringMVC和Mybatis,SpringMVC是包含在Spr ...

  6. 【Java实战篇】SpringBoot+MyBatis快速实现登录注册

    目录 项目结构: 数据库表: 项目依赖:POM文件 Properties配置文件: 静态页面: Login.html: Reg.html: Success.html: END1.html: END2. ...

  7. SSM整合 登录注册小项目

    整合SSM制作登录注册功能 首先 引入pom.xml 配置  对应版本确定无冲突  注意反射插件的引入路径 <?xml version="1.0" encoding=&quo ...

  8. 界面小项目之小米登录注册

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>登录 ...

  9. SpringBoot整合Shiro搭建登录注册认证授权权限项目模板

    主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...

最新文章

  1. 15:解决IntelliJ IDEA的乱码问题
  2. 网络系统管理之静态路由配置
  3. MySQL8.0启动服务的代码_MySQL8.0服务启动(windows10)
  4. linux重新安装mysql步骤_Linux下MySQL安装及相关操作过程
  5. 中文通用百科知识图谱(CN-DBpedia)
  6. java单例模式的实现方法_JAVA单例模式的几种实现方法
  7. 博士当中学老师是“人才浪费”?
  8. 360浏览器自定义切核功能
  9. AppBoxPro - 细粒度通用权限管理框架(可控制表格行内按钮)源码提供下载
  10. Highcharts:小案例,自定义图片下载路径,中文乱码的解决办法(不足之处,求指点)。...
  11. Android NavigationView中设置menu中的item字体颜色
  12. sybase数据库导出mysql_sybase数据库导出表结构
  13. excel连接64位oracle数据库,excel表格oracle数据库-excel怎样连接oracle数据库(白痴级提问)...
  14. 输入法 - 字母宽 窄 切换 - 全角 半角 的含义
  15. MySQL第一节课总结
  16. 英语音标、发音技巧、浊化规则
  17. Pipeline支撑运维自动化:sftp原子模块
  18. 大数据开发方向分享:春招获蚂蚁金服、拼多多、华为(终端)、远景能源、华泰证券等offer
  19. OD和CE使用示例-Python实现win98扫雷一键标雷外挂
  20. 数字媒体概论——2D图像图形

热门文章

  1. linux 丢包排查思路简述(tcp+rdma)
  2. leetcode -- 303. 区域和检索 - 数组不可变
  3. 深入理解事件循环机制
  4. 1081 Rational Sum (20 分)_22行代码AC
  5. mysql 条件 函数_mysql 函数 时间函数,数学函数,字符串函数,条件判断函数
  6. 未公开接口主要指以下哪几类_Java8的 Stream 函数式接口,你了解多少?
  7. 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)
  8. Python爬虫 解析库的使用
  9. vue mianjs 引用css_vue 学习记录八——webpack中常见的配置项
  10. java process exit_Java Process exitValue()方法