登录注册的小项目对比.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)
        {
            //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   请到如鹏网

时间: 2024-10-06 00:11:28

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

微信小程序组件构建UI界面小练手 —— 表单登录注册微信小程序

通过微信小程序中丰富的表单组件来完成登录界面.手机快速注册界面.企业用户注册界面的微信小程序设计. 将会用到view视图容器组件.button按钮组件.image图片组件.input输入框组件.checkbox多项选择器组件.switch开关选择组件.navigator页面连接组件等. Ⅰ.登录设计 登录表单中,需输入账号.密码进行登录,在账号.密码输入框中都有友好的提示信息:登录按钮默认是灰色不可用状态,只有输入内容后,才会变为可用状态:在登录按钮下面提供手机快速注册.企业用户注册.找回密码链

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

最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣.根据<go web编程>中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜: 这个例子使用到了beego框架和beedb框架,如果是go新手beego和beedb得自己去google下载安装. 目录结构: index.go package controllers import ( "fmt" "github.com/astaxie/beego"

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

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>登录注册</title> <style> body, ul { margin: 0; padding: 0; list-style: none; } .login { width: 300px; height: 350px; border: 1px solid #aaaaaa; margi

Android的SQLiteDataBase小项目,实现user类登陆注册以及student类增删改查

关于SQLiteDataBase这块,大体有两种主要的实现方式,一种是不使用Helper类的方式,此种方式存在一个弊端,即不能oncreate两次,如果重复使用oncreate的button,则会报错,所以为了避免这种错误,在此项目中使用类继承SQLiteOpenHelper的方式进行SQLite3小型数据库的小项目开发,简单的实现登陆注册,以及对特定vo类的增删改查,中间还夹杂了ListView,ArrayAdapter,以及Intent的散知识点. 以下为正文:首先介绍以下我写的项目的框架,

小波Linux安卓Sqlite数据库实现用户登录注册,通俗易懂!

看了很多别人写的安卓SQlite数据的操作代码,都是浮云,瞎弄!一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下! 一SQLiteHelper类是自动重载增删改查函数的,另外一个是自己定义的类,用Context传值.我用的是Fragment,用Activity的话吧getActivity()去掉! 实现了用户登录注册的功能! http://www.cnblogs.com/xiaobo-Linux/ (小波)赵存档QQ463431476 public class

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

crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db import models from multiselectfield import MultiSelectField course_choices = (('Linux', 'Linux中高级'), ('PythonFullStack', 'Python高级全栈开发'),) class_type_choi

Java图形界面开发—简易登录注册小程序

登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的地方,详见其它博客. Java程序操作数据库SQLserver详解 功能介绍:简单的登录注册系统,使用了数据库sqlserver.单例模式.正则表达式以及图形化开发等知识. 1.在登录界面,可以登录或者注册用户. 注册用户界面,按照正则表达式规定的格式要求来输入信息,若有误,则重新输入. 2.点击注册,首先连接SQLserver数据库,连接成功则会判断该用户名是否已经存在,若存在,则给出提示.反之则进行注册

项目案例模板之登录注册的实现

项目案例模板之登录注册的实现 案例演示 案例代码 设计表 pom.xml  <dependencies>  <dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.11</version>    <scope>test</scope>  </dependency

路飞项目搭建3 TODO注释, 自定义模态框, vue-cookies操作浏览器cookies, 腾讯云短信开发, 代码(登录注册页面,多方式登录,手机是否存在验证接口,腾讯短信开发)

TODO注释 """ 作用:todo是一种特殊的注释,书写就是 # TODO 注释内容,可以在TODO控制台面板快速定位注释位置 """ 自定义模态框 componses/Login.vue <template> <div class="login"> <span @click="close_login">x</span> </div> </