ABP入门系列(3)——领域层定义仓储并实现

ABP入门系列目录——学习Abp框架之实操演练

一、先来介绍下仓储

仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。

在ABP中,仓储类要实现IRepository接口,接口定义了常用的增删改查以及聚合方法,其中包括同步及异步方法。主要包括以下方法:

IRepository接口定义的方法

ABP针对不同的ORM框架对该接口给予了默认的实现;
针对EntityFramework,提供了EfRepositoryBase<TDbContext, TEntity, TPrimaryKey>的泛型版本的实现方式。
针对NHibernate,提供了NhRepositoryBase<TEntity, TPrimaryKey>的泛型版本的实现方式。

泛型版本的实现就意味着,大多数的时候,这些方法已足已应付一般实体的需要。如果这些方法对于实体来说已足够,我们便不需要再去创建这个实体所需的仓储接口/类。

直接通过在应用服务层定义仓储引用,然后通过构造函数注入即可。在我们的应用服务层即可按以下方式使用Task仓储:

public class TaskAppService : ITaskAppService { 
private readonly IRepository<Task> _taskRepository; 
public TaskAppService(IRepository<Task> taskRepository) 
{ 
    _taskRepository = taskRepository; 
}

示例代码中使用的就是这种方式。

二、如何实现自定义仓储

假设我们需要查找某个用户都分配哪些任务。

  1. 在领域层,创建IRepositories文件夹,然后定义IBackendTaskRepository。

    namespace LearningMpaAbp.IRepositories
    {
    /// <summary>
    /// 自定义仓储示例
    /// </summary>
    public interface IBackendTaskRepository : IRepository<Task>
    {
        /// <summary>
        /// 获取某个用户分配了哪些任务
        /// </summary>
        /// <param name="personId">用户Id</param>
        /// <returns>任务列表</returns>
        List<Task> GetTaskByAssignedPersonId(long personId);
    }
    }
  2. 在基础架构层,实现该仓储。

    namespace LearningMpaAbp.EntityFramework.Repositories
    {
    public class BackendTaskRepository:LearningMpaAbpRepositoryBase<Task>,IBackendTaskRepository
    {
        public BackendTaskRepository(IDbContextProvider<LearningMpaAbpDbContext> dbContextProvider) : base(dbContextProvider)
        {
        }
    
        /// <summary>
        /// 获取某个用户分配了哪些任务
        /// </summary>
        /// <param name="personId">用户Id</param>
        /// <returns>任务列表</returns>
        public List<Task> GetTaskByAssignedPersonId(long personId)
        {
            var query = GetAll();
    
            if (personId>0)
            {
                query = query.Where(t => t.AssignedPersonId == personId);
            }
    
            return query.ToList();
        }
    }
    }

    该仓储实现,继承自模板生成的LearningMpaAbpRepositoryBase泛型抽象类,然后再实现IBackendTaskRepository接口。这里要显示声明实现类的有参构造函数,使用泛型的IDbContextProvider将数据库上下文的子类ChargeStationContext传给父类的构造函数。

自定义仓储的代码路径

三、仓储的注意事项

  1. 仓储方法中,ABP自动进行数据库连接的开启和关闭。
  2. 仓储方法被调用时,数据库连接自动开启且启动事务
  3. 当仓储方法调用另外一个仓储的方法,它们实际上共享的是同一个数据库连接和事务。
  4. 仓储对象都是暂时性的,因为IRepository接口默认继承自ITransientDependency接口。所以,仓储对象只有在需要注入的时候,才会由Ioc容器自动创建新实例。
  5. 默认的泛型仓储能满足我们大部分的需求。只有在不满足的情况下,才创建定制化的仓储。

源码已上传至Github-LearningMpaAbp,可自行参考。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
ABP框架中,仓储(Repository)是用于访问数据库的一个抽象,它封装了数据访问的具体实现,提供了一系列的标准化的数据访问接口,方便应用程序进行数据的CRUD(增删改查)操作。 在使用仓储进行查询时,可以使用ABP框架提供的标准查询接口和方法,也可以使用EF Core(Entity Framework Core)提供的原生查询接口和方法。 以下是使用ABP框架提供的标准查询接口和方法进行查询的示例代码: ```csharp public interface IProductRepository : IRepository<Product, Guid> { Task<List<Product>> GetProductsByNameAsync(string name); } public class ProductRepository : EfCoreRepositoryBase<MyProjectDbContext, Product, Guid>, IProductRepository { public ProductRepository(IDbContextProvider<MyProjectDbContext> dbContextProvider) : base(dbContextProvider) { } public async Task<List<Product>> GetProductsByNameAsync(string name) { return await GetListAsync(p => p.Name.Contains(name)); } } ``` 在上述示例中,我们定义了一个IProductRepository接口和一个ProductRepository实现类,用于查询名字包含指定字符串的产品列表。我们通过继承EfCoreRepositoryBase来实现Repository,并通过GetListAsync方法进行查询。 还可以使用EF Core提供的原生查询接口和方法进行查询,例如: ```csharp public async Task<List<Product>> GetProductsByNameAsync(string name) { return await DbContext.Products.Where(p => p.Name.Contains(name)).ToListAsync(); } ``` 在上述示例中,我们直接通过DbContext进行查询,使用Where方法添加查询条件,并使用ToListAsync方法获取查询结果。 无论使用哪种方式,都需要在仓储定义具体的查询方法,并在需要查询数据的地方进行调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值