登陆注册的小项目对比.Net Core与 .Net Framework的一些区别

1、需求:html

    一、功能只有登陆、注册。数据库

2、架构:json

    一、分别为架构

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

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

             UserSys.DTO :主要是咱们Web层中须要什么实体就给传递什么实体函数

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

             UserSys.Web:Asp.Net MVCui

                         

    二、Web层采用Asp.Net MVCthis

    三、数据库访问经过EF

3、具体实现

   一、写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   必定要写上版本号

      二、对实体中的字段进行配置  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);            
        }
    }

       三、封装一个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中的

                     

         四、开始写对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);
    }

         五、写实现类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,因此就不写具体怎么写了。

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

            一、.Net FrameWork中咱们经过IOC对类进行注入,怎么注入自行百度,方法不少,我主要说下.Net Core中怎么注入

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

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

             二、.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   请到如鹏网

相关文章
相关标签/搜索