定义仓储
在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文件夹,存放所有的实体仓储接口。
今晚就到这里吧,下一篇我们讲《实现仓储》。
相关文章
- “M_PI_2”: 重复定义的宏
- 指针与字符串:(const)char *p2 = "lmj";定义的是一个字符串常量!符串常量,正因为是常量,所以它内部的字符是不允许修改的。
- 6-1python语法基础-面向对象-类的定义属性和方法,类的作用域,类的封装继承多态,类的反射,单例模式
- Atitit 事务的一些概念 目录 1. 事务的另一个特性:数据隔离级别1 2. Spring五个事务隔离级别和七个事务传播行为1 3. 在TransactionDefinition接口中定义了
- 【手写Tomcat】6.实现自己定义的MyHttpResponse
- 定义一个超链接,点击超链接后,执行一段代码,页面不跳转
- Android定义的路径全局变量
- 基础知识~ 状态机的定义及Verilog代码实现
- 【K8S系列】第四讲:kubadm部署k8s时service-cidr网络和pod-network-cidr的地址如何定义
- Python定义函数及引用