登录注册的小项目对比.Net Core与 .Net Framework的一些区别
一、需求:
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的一些区别相关推荐
- SSM实现登录注册的小案例(手把手喂饭)
SSM实现登录注册的小案例 温馨提示 为了您有更好的阅读体验,原文链接如下,长理小生:https://lixingweiblog.github.io/Pages SpringMVC+Spring+My ...
- Django写一个登录注册---001创建项目以及设计数据库
Djanog开发小项目实践,众所周知,一个产品往往需要登录注册这些功能,所以我这里实现一下登录注册的开发. 使用pycharm(专业版)创建一个django项目,不是专业版看不到创建django的字样 ...
- 用户登录注册流程图-所有项目论文通用计算机毕业设计
系统模块详细设计 (1) 用户注册 消费者必须注册才能购买商品,注册流程如图4.3所示. (2) 用户登录 输入时,用户必须输入用户名和密码.系统确认用户输入的信息.如果用户的输入不正确,则用户需要知 ...
- Java游戏用户登录注册_java___控制台可以实现简单的登录注册的小游戏平台
话不多说直接上代码: package pt; import java.util.Scanner; public class Test { public static void main(String[ ...
- SSM整合之登录注册
一.概述 本文以一个登录注册的小功能作为示例,对SSM框架做一个整合. 二.SSM整合 SSM框架是指Spring.SpringMVC和Mybatis,SpringMVC是包含在Spr ...
- 【Java实战篇】SpringBoot+MyBatis快速实现登录注册
目录 项目结构: 数据库表: 项目依赖:POM文件 Properties配置文件: 静态页面: Login.html: Reg.html: Success.html: END1.html: END2. ...
- SSM整合 登录注册小项目
整合SSM制作登录注册功能 首先 引入pom.xml 配置 对应版本确定无冲突 注意反射插件的引入路径 <?xml version="1.0" encoding=&quo ...
- 界面小项目之小米登录注册
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>登录 ...
- SpringBoot整合Shiro搭建登录注册认证授权权限项目模板
主要内容: 1 SpringBoot整合Shiro安全框架; 2 Shiro主要学习内容总结;(执行流程.主要对象接口.注意事项等) 3 Redis实现对权限信息缓存; ! 温馨提示: 想要快速搭Sh ...
最新文章
- 15:解决IntelliJ IDEA的乱码问题
- 网络系统管理之静态路由配置
- MySQL8.0启动服务的代码_MySQL8.0服务启动(windows10)
- linux重新安装mysql步骤_Linux下MySQL安装及相关操作过程
- 中文通用百科知识图谱(CN-DBpedia)
- java单例模式的实现方法_JAVA单例模式的几种实现方法
- 博士当中学老师是“人才浪费”?
- 360浏览器自定义切核功能
- AppBoxPro - 细粒度通用权限管理框架(可控制表格行内按钮)源码提供下载
- Highcharts:小案例,自定义图片下载路径,中文乱码的解决办法(不足之处,求指点)。...
- Android NavigationView中设置menu中的item字体颜色
- sybase数据库导出mysql_sybase数据库导出表结构
- excel连接64位oracle数据库,excel表格oracle数据库-excel怎样连接oracle数据库(白痴级提问)...
- 输入法 - 字母宽 窄 切换 - 全角 半角 的含义
- MySQL第一节课总结
- 英语音标、发音技巧、浊化规则
- Pipeline支撑运维自动化:sftp原子模块
- 大数据开发方向分享:春招获蚂蚁金服、拼多多、华为(终端)、远景能源、华泰证券等offer
- OD和CE使用示例-Python实现win98扫雷一键标雷外挂
- 数字媒体概论——2D图像图形
热门文章
- linux 丢包排查思路简述(tcp+rdma)
- leetcode -- 303. 区域和检索 - 数组不可变
- 深入理解事件循环机制
- 1081 Rational Sum (20 分)_22行代码AC
- mysql 条件 函数_mysql 函数 时间函数,数学函数,字符串函数,条件判断函数
- 未公开接口主要指以下哪几类_Java8的 Stream 函数式接口,你了解多少?
- 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)
- Python爬虫 解析库的使用
- vue mianjs 引用css_vue 学习记录八——webpack中常见的配置项
- java process exit_Java Process exitValue()方法