iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

分層式架構,在本專案分為:
1.DataAccess
存放資料庫連線相關程式碼與檔案
包含連線字串與Migration與建立的Repository & UnitOfWork
2.Models
存放資料欄位的定義。
資料表相關在此存放。
3.Utility
存放共用函式庫,訂單與會員系統會使用到

  • 分別新增專案=>類別庫=>選擇.net8.0
    專案.DataAccess
    專案.Models
    專案.Utility
    https://ithelp.ithome.com.tw/upload/images/20240914/20147438VUDpWtZRYr.jpg

將DataAccess、Models、Utility的Class.cs都刪除。
1.DataAccess:將原本Data與Migrations資料夾移入DataAccess
2.Models:將Models資料夾內的Model移入專案Models;
專案Models新增ViewModels資料夾
3.Utility
右鍵=>加入-類別=>取名SD.cs
https://ithelp.ithome.com.tw/upload/images/20240914/20147438tfHVvUglkX.jpg

  • 修正ApplicationDbContext.cs
    開啟NuGet,在DataAccess安裝:
    Microsoft.EntityFrameworkCore
    Microsoft.EntityFrameworkCore.SqlServer
    Microsoft.AspNetCore.Identity.EntityFrameworkCore
    原專案內的套件可以移除或不做處理。
    https://ithelp.ithome.com.tw/upload/images/20240914/20147438q8OtEcFjei.jpg

  • DataAccess專案參考
    DataAccess=>右鍵=>加入=>專案參考勾選Models與Utility
    https://ithelp.ithome.com.tw/upload/images/20240914/20147438R2itn2d3x6.jpg

  • Repository與UnitOfWork
    1.Repository:
    代表一個Table
    2.UnitOfWork:
    代表一個資料庫DB
    同時更新或新增多個資料表時,使用UnitOfWork,用於追蹤每個動作。
    CRUD時,DbContext將變更紀錄一次性寫入資料庫。

  • Repository
    1.建立資料庫介面:Repository
    2.實現資料庫介面:包含方法實現(IRepository的定義)
    3.在IUnitOfWork內加入屬性
    IUnitOfWork:此為IcategoryRepository創建對象
    4.在IUnitOfWork內設置屬性
    分配DbContext設置IUnitOfWork中的屬性

  • 新增Repository與UnitOfWork
    1.DataAccess=>右鍵=>加入新增資料夾=> Repository。
    新增Repository.cs介面
    新增UnitOfWork
    2.Repository底下新增IRepository資料夾
    IRepository新增IRepository.cs介面
    新增IUnitOfWork

https://ithelp.ithome.com.tw/upload/images/20240914/20147438YznogBY8xp.jpg

  • IRepository.cs
    定義了GetAll()方法,用於獲取全部類別。
    編輯時,需看到某個類別所有資料,使用Get()方法,將資料上傳到頁面。
    因每種資料編輯方式,可能會有不同,所以將編輯功能放在泛型Repository之外,只保留新增、刪除的部分。
    https://ithelp.ithome.com.tw/upload/images/20240914/20147438qWUs3oeebO.jpg
public interface IRepository<T> where T : class
    {
        IEnumerable<T> GetAll();
        T Get(Expression<Func<T, bool>> filiter);
        void Add(T entity);
        void Remove(T entity);
        void RemoveRange(IEnumerable<T> entit);
    }
  • Repository.cs
    新增程式碼在
public class Repository<T> : IRepository<T> where T : class
     {
        private readonly ApplicationDbContext _db;
        internal DbSet<T> dbSet;
        public Repository(ApplicationDbContext db)
        {
_db = db;
this.dbSet = _db.Set<T>();
        }
    }

將每個方法throw new NotImplementedException();實作
https://ithelp.ithome.com.tw/upload/images/20240914/201474386oFbar3N6E.jpg

public void Add(T entity)
{
    dbSet.Add(entity);
}
public T Get(Expression<Func<T, bool>> filiter)
{
    IQueryable<T> query = dbSet;
    query = query.Where(filiter);
    return query.FirstOrDefault();
}
public IEnumerable<T> GetAll()
{
    IQueryable<T> query = dbSet;
    return query.ToList();
}
public void Remove(T entity)
{
    dbSet.Remove(entity);
}
public void RemoveRange(IEnumerable<T> entity)
{
    dbSet.RemoveRange(entity);
}

_db是可讀取變數。
ApplicationDbContext代表程式與資料庫連結。
dbSet是DbSet變數,EF提供的通用型別。
用來代表資料庫中的資料集合。
其中T是通用型參數。
DbSet物件可動態存取不同資料表,
不用為每個資料表都寫專門的程式。

*建立UnitOfWork

將SaveChanges() ,新增至UnitOfWork
IUnitOfWork再使用Save調用,會比較簡潔。

public class UnitOfWork : IUnitOfWork
    {
        private ApplicationDbContext _db;
public UnitOfWork(ApplicationDbContext db)
        {
       _db = db;
}
        public void Save()
        {
         _db.SaveChanges();
        }
    }
  • 建立UnitOfWork
public interface IUnitOfWork
    {
     void Save();
    }
  • 建立Area
    1.用途:依不同權限、機制劃分區域。
  • 例如:管理與使用端區域,方便管理程式碼。
    2.新增Area至專案內(右鍵=>新增資料夾=>Areas)
    Area內各別新增Customer與Admin兩個區域。
    Area=>右鍵加入=>scaffold項目=>MVC區域=>命名Admin&Customer
    新增完後,刪除Admin&Customer的Data與Models資料夾。
    Home的Controller移至Controller資料夾。(移動時跳出調整命名空間,選是即可)。
    Home的Controller 新增Area的路由。
    刪除原先的Controller資料夾。

https://ithelp.ithome.com.tw/upload/images/20240914/201474386pw17dawKn.jpg

View內的Category與Home移至Admin與Customer底下的View資料夾。
_ViewImports.cshtml、_ViewStart.cshtml則要同時複製, 貼上到Admin與Customer底下的View資料夾。

https://ithelp.ithome.com.tw/upload/images/20240914/20147438vY56GlsPDG.jpg

Program.cs註冊依賴注入與修改預設路由:

app.MapControllerRoute(
    name: "default",
    pattern: 
"{area=Customer}/{controller=Home}/{action=Index}/{id?}");

https://ithelp.ithome.com.tw/upload/images/20240914/20147438XeOjNFqGSw.jpg

新增:
builder.Services.AddRazorPages();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
錯誤處右鍵=>重構=>using UnitOfWork

以上就是分層架構的基礎框架。
明天進入如何建立資料。


上一篇
Day11 啟動專案
下一篇
Day13 建立類別
系列文
asp.net core 分層架構快速上手31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言