ABP (ASP.NET Boilerplate) 應用程式開發框架 新手教學 No.5 建立倉儲 Repository

ABP (ASP.NET Boilerplate) 應用程式開發框架 新手教學 No.5 建立倉儲 Repository

ABP (ASP.NET Boilerplate) 應用程式開發框架 新手教學 No.0 索引


ABP有內建基本常用的倉儲功能例如CRUD,而我們可以進行擴充

在架構上倉儲的介面與實作是拆開分別在Domain層與基礎設施層的

先說倉儲的介面部分

這裡來做一個用Map的ID來取得對應Player集合的一個倉儲介面

首先一樣按照架構我們在Core專案中開一個IRepositories資料夾來放

MyCompany.MyProject.Core\IRepositories\

然後我們新增一個介面 IPlayerRepository.cs

using Abp.Domain.Repositories;
using MyCompany.MyProject.Entities;
using System.Collections.Generic;

namespace MyCompany.MyProject.IRepositories
{
    public interface IPlayerRepository : IRepository<Player, long>
    {
        List<Player> GetPlayersWithMap(long mapID);
    }
}

這樣我們就完成了倉儲的介面定義

而實作部分我們來到 AbsoluteDuo_V4.EntityFramework\Repositories\

建立一個類別 PlayerRepository.cs 該類別繼承ABP提供的基底類別 MyProjectRepositoryBase 並且繼承我們剛剛定義的介面 IPlayerRepository

using Abp.EntityFramework;
using MyCompany.MyProject.Entities;
using MyCompany.MyProject.IRepositories;
using System.Collections.Generic;
using System.Linq;

namespace MyCompany.MyProject.EntityFramework.Repositories
{
    public class PlayerRepository : MyProjectRepositoryBase<Player, long>, IPlayerRepository
    {
        public PlayerRepository(IDbContextProvider<MyProjectDbContext> dbContextProvider) : base(dbContextProvider)
        {

        }

        public List<Player> GetPlayersWithMap(long mapID)
        {
            // GetAll()返回一個IQueryable<T>,我們可以通過它來查詢
            var query = GetAll();

            // 也可以直接使用EF的DbContext對象
            //var query2 = Context.Players.AsQueryable(); 

            // 另一種選擇:直接使用Table屬性代替"Context.Players",都是一樣的。
            //var query3 = Table.AsQueryable();

            if (mapID > 0)
            {
                query = query.Where(c => c.MapID == mapID);
            }
            return query.ToList();
        }

        public async Task<List<Player>> GetPlayersWithMapAsync(long mapID)
        {
            return await GetAllListAsync(c => c.MapID == mapID);
        }
    }
}
  • GetAll()
    返回IQueryable<T>
    因為有延遲載入(Lazy Loading)的特性,所以實際與資料庫連接是在使用ToList()方法時
  • GetAllList()
    返回List<T>
    這個則是在呼叫時就會立即從資料來源取出資料

到這邊倉儲就已經建立完成了


下一篇

ABP (ASP.NET Boilerplate) 應用程式開發框架 新手教學 No.6 建立應用服務

參照

一步一步使用ABP框架搭建正式項目系列教程

PS5