天天看點

實作倉儲

傳回總目錄《一步一步使用ABP架構搭建正式項目系列教程》

這一節我們來實作上一節定義的倉儲接口。

上一節是在領域層定義的倉儲接口,但是需要注意的是,實作這些倉儲接口是在基礎設施層,在我的項目中就是EntityFramework層。這樣做的好處就是領域層完全獨立于基礎設施層,耦合程度大大降低。

上一節我們定義了一個ICityRepository倉儲接口,是以接下來我們來實作它。現在我們找到基礎設施層名為“Repositories”的檔案夾,在這裡面存放實作倉儲接口的類。這個檔案夾是ABP模闆自動幫我們生成的,而且可以它看到還有一個父目錄EntityFramework。本目錄下ABP模闆已經幫我們建立了一個倉儲基類“ChargeStationRepositoryBase”,以後如果我們要給倉儲實作添加公共的方法時,就可以直接添加到該基類中。父目錄下有一個之前講過的資料庫上下文類的子類。

實作倉儲
接下來,在Repositories檔案夾裡定義ICityRepository的實作類CityRepository,代碼如下:

namespace Noah.ChargeStation.EntityFramework.Repositories
{
    public class CityRepository:ChargeStationRepositoryBase<Cities>,ICityRepository
    {
        public CityRepository(IDbContextProvider<ChargeStationDbContext> dbContextProvider):base(dbContextProvider)
        {
            
        }
        public List<Cities> GetCitiesWithProvince(string provinceCode)
        {
            var query = GetAll();//GetAll()傳回一個IQueryable<T>,我們可以通過它來查詢
              var query2 = Context.Cities.AsQueryable();//也可以直接使用EF的DbContext對象
              var query3 = Table.AsQueryable();//另一種選擇:直接使用Table屬性代替"Context.Cities",都是一樣的。
              if (!string.IsNullOrEmpty(provinceCode))
            {
                query = query.Where(c => c.ProvinceCode == provinceCode);
            }
            return query.ToList();
        }
    }
}      

CityRepository繼承了泛型的ChargeStationRepositoryBase類,而且實作了倉儲接口。這裡要顯示聲明實作類的有參數的構造函數,使用泛型的IDbContextProvider将資料庫上下文的子類ChargeStationContext傳給父類的構造函數。

GetCitiesWithProvince(…)方法是我們實作倉儲接口ICityRepository中的方法,也是我們自己特殊需要的方法。

在倉儲中,我們可以自由地使用Context(EF的DbContext)對象和資料庫。ABP架構為我們管理資料庫連接配接,事務,建立和釋放DbContext,因而不用我們自己處理了。

這裡我們也可以定義一個異步版本的方法,功能和上面的方法相同(關于異步的部落格,可以看我的目錄《C#異步程式設計》):

public async Task<List<Cities>> GetCitiesWithProvinceAsync(string provinceCode)
        {
            return await GetAllListAsync(c => c.ProvinceCode == provinceCode);
        }      

這裡注意一下GetAll()方法和GetAllList()方法的差別:前者傳回的類型是IQueryable<T>,後者是List<T>。說到這裡又不得不說下IQueryable<T>和List<T>的差別。

IQueryable<T>:

當你在Repository對象以外的地方調用GetAll這個方法,必定會開啟資料庫連接配接。這是因為IQueryable<T>允許延遲執行。隻有在IQueryable<T>(或一些存取已查詢的對象方法)上使用ToList()或foreach()疊代IQueryable<T>時,才會實際執行資料庫的查詢。是以,當你調用ToList方法時,資料庫連接配接必需是啟用狀态。我們可以使用ABP所提供的UnitOfWork特性在調用的方法上來實作。注意,Application Service方法預設都已經是UnitOfWork。是以,使用了GetAll方法就不需要如同Application Service的方法上添加UnitOfWork特性。

List<T>:

傳回的該結果說明已經執行了資料庫查詢或者已經從記憶體中取出了資料(如果記憶體中有的話)。

好的,今天的實作倉儲就講到這,下一次說《建構應用層服務》。

如果您認為這篇文章還不錯或者有所收獲,您可以通過右邊的“打賞”功能 打賞我一杯咖啡【物質支援】,也可以點選右下角的【好文要頂】按鈕【精神支援】,因為這兩種支援都是我繼續寫作,分享的最大動力!

作者:tkb至簡

來源:http://farb.cnblogs.com/

聲明:原創部落格請在轉載時保留原文連結或者在文章開頭加上本人部落格位址,如發現錯誤,歡迎批評指正。凡是轉載于本人的文章,不能設定打賞功能,如有特殊需求請與本人聯系!

已将所有贊助者統一放到單獨頁面!簽名處隻保留最近10條贊助記錄!檢視贊助者清單

衷心感謝打賞者的厚愛與支援!也感謝點贊和評論的園友的支援!
打賞者 打賞金額 打賞日期
微信:匿名 10.00 2017-08-03
2017-08-04
5.00 2017-06-15
支付寶:一個名字499***@qq.com 2017-06-14
16.00 2017-04-08
支付寶:向京劉 2017-04-13
2017-003-08
2017-03-08
支付寶:lll20001155 2017-03-03
支付寶:她是一個弱女子 2017-03-02