• 技术文章 >后端开发 >C#.Net教程

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

    黄舟黄舟2017-01-16 17:26:38原创2271

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

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


    194.png

    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; 
    }

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

    二、如何实现自定义仓储

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

    在领域层,创建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);
    }
    }

    在基础架构层,实现该仓储。

    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传给父类的构造函数。

    195.png


    三、仓储的注意事项

    仓储方法中,ABP自动进行数据库连接的开启和关闭。

    仓储方法被调用时,数据库连接自动开启且启动事务。

    当仓储方法调用另外一个仓储的方法,它们实际上共享的是同一个数据库连接和事务。

    仓储对象都是暂时性的,因为IRepository接口默认继承自ITransientDependency接口。所以,仓储对象只有在需要注入的时候,才会由Ioc容器自动创建新实例。

    默认的泛型仓储能满足我们大部分的需求。只有在不满足的情况下,才创建定制化的仓储。

    源码已上传至Github-LearningMpaAbp,可自行参考。
    ABP入门系列目录——学习Abp框架之实操演练

    以上就是ABP入门系列(4)——领域层定义仓储并实现的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:ABP入门系列(3)——领域层创建实体 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 从0自学C#04--特性和设计原则• 【c#教程】C# 属性(Property)• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• asp.net 图片验证码的HtmlHelper• C# 动态加载Dll
    1/1

    PHP中文网