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 請到如鵬網