在DDD(領域驅動設計)設計中,倉儲實現了對數據進行特定操作的代碼。ABP使用泛型IRepository接口為每一個實體創建了一個自動的倉儲。IRepository定義了select,
insert,update和一些更多的通用方法:
ABP框架已經內置了這么多常用的操作方法,當然,我們也可以根據自己的需求擴展這些倉儲。比如,在我的項目中,有一個省份表和城市表,省份表有一個省份編碼字段
Code,每一個城市都對應一個省份,省份和城市之間是一對多的關系,城市表有一個ProvinceCode字段,對應省份表的Code字段。現在有這么個需求,根據省份編碼獲得
該省份的所有城市。這個需求ABP框架沒有實現,所以我們必須自己實現。因而我要創建一個City倉儲。因為我要把接口和實現分離,所以我要首先聲明倉儲的接口。
這里是我定義的City倉儲接口ICityRepository:
public interface ICityRepository:IRepository<Cities> { List<Cities> GetCitiesWithProvince(string provinceCode); }
該接口擴展了ABP框架的泛型IRepository接口,因此,ICityRepository默認繼承定義了所有這些方法。正如我這里自己定義的GetCitiesWithProvince(…)方法,
也可以添加自己的方法。如果默認的方法足夠使用,就不需要創建實體的倉儲了。ABP提供了一種不需要創建倉儲類就能注射泛型倉儲的方式。
public class ProvinceAppService:ChargeStationAppServiceBase,IProvinceAppService { private IRepository<Provinces> _provinceRepository; public ProvinceAppService(IRepository<Provinces> provinceRepository) { _provinceRepository = provinceRepository; } public void CreateProvince(ProvinceInput input) { //DoSomething } }
省份實體類不需要其他的自定義方法,使用ABP框架的IReposity接口定義的方法就足夠了,因而不需要在領域層定義倉儲接口。以上代碼是在ABP的應用服務層定義的關於
省份的服務類,雖然沒有省份的相應倉儲,但是依然通過泛型的IRepository進行了構造函數的依賴注入。我們依然可以在此服務類中使用該接口通用的方法。
在ABP框架中,倉儲接口定義在Core項目中,因為它們是領域/業務層的一部分。所以我們最好在Core項目層中定義一個IRepositories文件夾,存放所有的實體倉儲接口。
今晚就到這里吧,下一篇我們講《實現倉儲》。