定义仓储

返回总目录《一步一步使用ABP框架搭建正式项目系列教程》


在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文件夹,存放所有的实体仓储接口。

今晚就到这里吧,下一篇我们讲《实现仓储》。

posted @ 2015-10-31 23:25  tkbSimplest  阅读(...)  评论(...编辑  收藏