.net core webapi搭建(3)Code first+拆層三層+倉儲

將項目拆層

咱們要 將項目拆分紅web

Infrastructure     基礎層數據庫

Core                   核心層json

Utility                  工具api

 

咱們想在就把項目拆分開,拆分後的結構以下:跨域

 

建立BaseEntity

    public abstract class EntityBase
    {
        //自增加逐漸
        public int Id { get; set; }
        //是否刪除 從此確定要軟刪除的
        public bool Deleted { get; set; }
        //建立時間
        public DateTime CreateTime { get; set; }
        //刪除時間
        public DateTime? DeleteTime { get; set; }

    }

  

建立IRepository

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));
    }

  

建立UserInfo實體類

    [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; }
    }

Infrastructure添加Nuget管理

Microsoft.EntityFrameworkCore.Designapp

Microsoft.EntityFrameworkCore.Toolside

Pomelo.EntityFrameworkCore.MySql工具

建立EntityBaseConfiguration

    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);
    }

  

建立UserInfoConfiguration

    public class UserInfoConfiguration : EntityBaseConfiguration<UserInfo>
    {
        public override void ConfigureDerived(EntityTypeBuilder<UserInfo> b)
        {
            //根據本身狀況看着瞎寫吧  就這樣 不BB
        }
    }

開整BaseContext

    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表示成功建立數據庫。

原本寫到這裏我又不想寫了。

可是寫成這模樣。不給你們看看實現方法 好像挺坑比的。

 

建立UserInfo的接口類:IUserInfoRepository

    public interface IUserInfoRepository : IRepository<UserInfo>
    {
        /// <summary>
        /// 檢查用戶是存在
        /// </summary>
        /// <param name="userName">用戶名</param>
        /// <param name="password">密碼</param>
        /// <returns>存在返回用戶實體,不然返回NULL</returns>
        UserInfo CheckUser(string userName, string password);
    }

 

建立UserInfo的實現類

    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 = "哈哈哈哈" };
        }
    }

 

去webapi整他丫的

在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);
        }
    }

好了哥們們。完活了。

相關文章
相關標籤/搜索