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 建立應用服務
參照