一、需求:

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)
{
//Filter
services.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. 微信小程序组件构建UI界面小练手 —— 表单登录注册微信小程序

    通过微信小程序中丰富的表单组件来完成登录界面.手机快速注册界面.企业用户注册界面的微信小程序设计. 将会用到view视图容器组件.button按钮组件.image图片组件.input输入框组件.che ...

  2. thinkphp写的登录注册的小demo

    和asp.net类似,一个FormAction对应Form文件夹 demo结构: ‘ 对于项目结构有疑问的: http://www.thinkphp.cn/document/60.html login ...

  3. go语言实现一个简单的登录注册web小程序

    最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣.根据<go web编程>中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜 ...

  4. Python学习:8.小项目之登录注册验证

    简介 本次项目登录注册验证是对之前学习知识点的加深学习,这次项目的练习的知识点有函数.判断语句.循环语句.文件操作等. 项目流程 运行代码之后,输出登录或者注册选项. 当选择登录之后,输入用户名密码, ...

  5. crm 系统项目(一) 登录,注册,校验

    crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db impo ...

  6. Azure AD B2C(二)使用Azure AD B2C为ASP.NET Core 应用设置社交帐户(邮箱)登录/注册

    一,引言 上次关于Azure AD B2C 讲到一些概念,有介绍到,Azure AD B2C 也是一种身份验证的解决方案,但是它运行客户使用其首选的社交,企业或者本地账户标识对应用程序和API进行单一 ...

  7. 微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)

    (一) 准备工作 (1) 登录注册 注册账号:这就不谈了,只需要注意使用一个全新的邮箱,别之前注册过公众号小程序等就可以了 https://mp.weixin.qq.com/wxopen/waregi ...

  8. Django项目登录注册系统

    Django项目之个人网站 关注公众号"轻松学编程"了解更多. Github地址:https://github.com/liangdongchang/MyWeb.git 感兴趣的可 ...

  9. [ionic开源项目教程] - 第15讲 ionic用户个人中心登录注册的实现

    第15讲 ionic用户个人中心登录注册的实现 这一讲包括登陆.注册.个人中心.个人资料页面的实现. 在一讲的改动有四个地方: 在config.js里配置接口地址 完善个人中心的服务层(service ...

  10. 【招聘App】—— React/Nodejs/MongoDB全栈项目:登录注册

    前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...

随机推荐

  1. 数据库系列:MySQL慢查询分析和性能优化

    1 背景 我们的业务服务随着功能规模扩大,用户量扩增,流量的不断的增长,经常会遇到一个问题,就是数据存储服务响应变慢. 导致数据库服务变慢的诱因很多,而RD最重要的工作之一就是找到问题并解决问题. 下 ...

  2. Thymeleaf中判断Security权限 - SpringBoot

    参考:https://blog.csdn.net/perfect_red/article/details/110821582

  3. 使用Navicat操作MySQL数据库

    一.Navicat连接数据库 ①进入Navicat,由于要使用的是MySQL数据库,选择MySQL ②输入连接名(这个是随便起的) 由上图可知连接数据库的四个要素 host:确定要操作的数据库在哪台电 ...

  4. 音频处理库:pydub与ffmpeg

    一句话简介:pydub--音频处理库:ffmpeg--音视频编解码工具. 一.  安装 安装pydub pip install pydub pip install ffprobe 安装ffmpeg m ...

  5. JZOJ 2020.02.01【NOIP提高组】模拟A 组

    2020.02.01[NOIP提高组]模拟A 组 二月份第一场比赛 闲话 惨烈啊! 50+30+0=80分 一题都没A 唉 最高150? \(zzh\) 暴虐A组 总结: 若干新东西 \(T1\) 我 ...

  6. 【雅礼联考DAY01】逃跑

    #pragma GCC optimize(2) #pragma GCC optimize(3) #include<cstdio> using namespace std; const in ...

  7. 代码随想录算法训练营day07 | leetcode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

    LeetCode 454.四数相加II 分析1.0 这个最直接暴力法,不过过于暴力了,害怕.jpg 失误 读题理解失误:题目要求的是四元组的个数,读完题到我这里成了输出四元组,悲哉 分析2.0 记录有 ...

  8. XShell 连接 VMware Linux

    如果你的系统是 Ubuntu,并且是精简安装的系统,极大可能使用ifconfig时会提示你安装相关依赖,所以你安装的时候要记得顺带安装 ifconfig: sudo apt install ifcon ...

  9. 一次线上OOM问题分析

    现象 线上某个服务有接口非常慢,通过监控链路查看发现,中间的 GAP 时间非常大,实际接口并没有消耗很多时间,并且在那段时间里有很多这样的请求. 原因分析 先从监控链路分析了一波,发现请求是已经打到服 ...

  10. Flutter 下载篇 - 贰 | 当下载器遇上切换网络库

    需求背景 继上篇<Flutter 下载篇 - 壹 | flutter_download_manager 源码解析>中详细介绍了 flutter_download_manager 用法和原理 ...