咱們要 將項目拆分紅web
Infrastructure 基礎層數據庫
Core 核心層json
Utility 工具api
咱們想在就把項目拆分開,拆分後的結構以下:跨域
public abstract class EntityBase { //自增加逐漸 public int Id { get; set; } //是否刪除 從此確定要軟刪除的 public bool Deleted { get; set; } //建立時間 public DateTime CreateTime { get; set; } //刪除時間 public DateTime? DeleteTime { get; set; } }
public interface IRepository<T> where T : EntityBase { /// <summary> /// 經過自增加主鍵獲取惟一Model /// </summary> /// <param name="id"></param> /// <returns></returns> Task<T> GetByIdAsync(int id); /// <summary> /// 經過自增加主鍵獲取惟一Model(包含字段) /// </summary> /// <param name="id"></param> /// <returns></returns> Task<T> GetByIdAsync(int id, params Expression<Func<T, object>>[] includes); Task<T> GetSingleAsync(Expression<Func<T, bool>> criteria); Task<T> GetSingleAsync(Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] includes); IEnumerable<T> ListAll(); Task<List<T>> ListAllAsync(); IEnumerable<T> List(Expression<Func<T, bool>> criteria); Task<List<T>> ListAsync(Expression<Func<T, bool>> criteria); IEnumerable<T> List(Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] includes); Task<List<T>> ListAsync(Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] includes); Task<int> CountAsync(); Task<int> CountAsync(Expression<Func<T, bool>> criteria); T Add(T entity, bool IsCommit = false); void Update(T entity); void Delete(T entity, bool IsCommit = false); void DeleteWhere(Expression<Func<T, bool>> criteria, bool IsCommit = false); void AddRange(IEnumerable<T> entities, bool IsCommit = false); void DeleteRange(IEnumerable<T> entities, bool IsCommit = false); void Attach(T entity); void AttachRange(IEnumerable<T> entities); void Detach(T entity); void DetachRange(IEnumerable<T> entities); void AttachAsModified(T entity); bool Commit(); bool Commit(bool acceptAllChangesOnSuccess); Task<bool> CommitAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken)); Task<bool> CommitAsync(CancellationToken cancellationToken = default(CancellationToken)); }
[Table("UserInfo")] public class UserInfo : EntityBase { /// <summary> /// 用戶名 /// </summary> public string UserName { get; set; } /// <summary> /// 用戶密碼 /// </summary> public string Password { get; set; } /// <summary> /// 用戶郵箱 /// </summary> public string UserMail { get; set; } }
Microsoft.EntityFrameworkCore.Designapp
Microsoft.EntityFrameworkCore.Toolside
Pomelo.EntityFrameworkCore.MySql工具
public abstract class EntityBaseConfiguration<T> : IEntityTypeConfiguration<T> where T : EntityBase { public virtual void Configure(EntityTypeBuilder<T> builder) { builder.HasKey(e => e.Id); ConfigureDerived(builder); } public abstract void ConfigureDerived(EntityTypeBuilder<T> b); }
public class UserInfoConfiguration : EntityBaseConfiguration<UserInfo> { public override void ConfigureDerived(EntityTypeBuilder<UserInfo> b) { //根據本身狀況看着瞎寫吧 就這樣 不BB } }
public class BaseContext : DbContext { public BaseContext(DbContextOptions<BaseContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //modelBuilder.ApplyConfiguration(new CustomerConfiguration()); modelBuilder.ApplyConfiguration(new UserInfoConfiguration()); } public DbSet<UserInfo> Users { get; set; } }
這時候的項目結構呢就變成了這個模樣ui
好~到這裏我打算結束了。算了。接着寫吧。怕大家罵我。spa
修改webapi的startup.cs
ConfigureServices方法改成
public void ConfigureServices(IServiceCollection services) { var connection = Configuration.GetConnectionString("MySqlConnection"); services.AddDbContext<BaseContext>(options => options.UseMySql(connection)); services.AddSingleton<IConfiguration>(Configuration); services.AddMvc(); }
對嘍,要修改appsettings.json
改爲這樣
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } }, "ConnectionStrings": { "MySqlConnection": "Data Source=localhost;Database=Test;User ID=root;Password=2323232323;pooling=true;CharSet=utf8;port=3306;sslmode=none" }, "RedisConfig": { "Redis_Default": { "Connection": "127.0.0.1: 6379", "InstanceName": "Redis1: " }, "Redis_6": { "Connection": "127.0.0.1: 6379", "DefaultDatabase": 6, "InstanceName": "Redis2: " }, "ReadWriteHosts": "172.16.75.230:6379" } }
而後咱們開始建立數據庫
Add-Migration MyFirstMigration
接着輸入Update-Database執行。出現Done表示成功建立數據庫。
原本寫到這裏我又不想寫了。
可是寫成這模樣。不給你們看看實現方法 好像挺坑比的。
public interface IUserInfoRepository : IRepository<UserInfo> { /// <summary> /// 檢查用戶是存在 /// </summary> /// <param name="userName">用戶名</param> /// <param name="password">密碼</param> /// <returns>存在返回用戶實體,不然返回NULL</returns> UserInfo CheckUser(string userName, string password); }
public class UserInfoRepository : EfRepository<UserInfo>, IUserInfoRepository { public UserInfoRepository(BaseContext dbcontext) : base(dbcontext) { } /// <summary> /// 獲取用戶 /// </summary> /// <param name="userName"></param> /// <param name="password"></param> /// <returns></returns> public UserInfo CheckUser(string userName, string password) { return List(x => x.UserName == userName && x.Password == password).FirstOrDefault() ?? new UserInfo() { UserName = "哈哈哈哈" }; } }
在startup.cs中的ConfigureServices方法中擼入如下代碼
var connection = Configuration.GetConnectionString("MySqlConnection"); services.AddDbContext<BaseContext>(options => options.UseMySql(connection)); services.AddScoped<IUserInfoRepository, UserInfoRepository>(); services.AddSingleton<IConfiguration>(Configuration);
好了。咱們去建立一個UserApi
[Route("api/[controller]")] public class UserController : Controller { private IUserInfoRepository _userRepository; private IConfiguration _configuration; public UserController(IUserInfoRepository UserRepository, IConfiguration Configuration) { _userRepository = UserRepository; _configuration = Configuration; } [HttpPost("Get")] [EnableCors("any")] //設置跨域處理的 代理 public IActionResult Get() { var _Sel = _userRepository.CheckUser("", ""); return Ok(_Sel.UserName); } }
好了哥們們。完活了。