zoukankan      html  css  js  c++  java
  • ABP学习入门系列(三) (领域层中的仓储Repository)

     一,仓储定义:“在领域层和数据映射层的中介,使用类似集合的接口来存取领域对象”
    (Martin Fowler) 。


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

    public UserAppService(
                IRepository<User, long> repository, 
                UserManager userManager, 
                IRepository<Role> roleRepository, 
                RoleManager roleManager)
                : base(repository)
            {
                _userManager = userManager;
                _roleRepository = roleRepository;
                _roleManager = roleManager;
            }
    

      以上为application层的一个service ,在ABP中,仓储类要实现IRepository接口,

    大部分情况下这些方法已足已应付一般实体的需要。如果这些方法对于实体来说已足够,我们便不需要再去创建这个实体所需的仓储接口/类。因此我们绝大多数情况下可以想上面的userappservice一样的实现IRepository,来满足数据存取的需求。

    二,假设 IRepository没有我们特需的方法。自定义仓储

    1,在领域层(core下),创建IRepositories文件夹,然后定义IBackendTaskRepository类。

    using Abp.Domain.Repositories;
    using System.Collections.Generic;
    using Task = LearningMpaAbp.Tasks.Task;
    
    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,在基础架构层(EntityFramework项目下的EntityFramework下的Repository下添加BackendTaskRepository类),实现该仓储。

    using Abp.EntityFramework;
    using LearningMpaAbp.IRepositories;
    using System.Collections.Generic;
    using System.Linq;
    using Task = LearningMpaAbp.Tasks.Task;
    
    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传给父类的构造函数。
     
    三,关于仓储的一些知识

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

    以上。。。
    参考:http://www.jianshu.com/p/6e90a94aeba4
    代码:https://github.com/tianxiangd/LearnAbp

      

  • 相关阅读:
    rails中输出excel
    Rails IDE 有很多选择,但是具体到ubuntu 64bit 选择的余地就不多了,这里选择Aptana Studio 3 Beta
    linux中查看系统资源占用情况的命令
    GIT GUI使用
    linux下的c 环境配置vim
    oracle11 忘记密码
    Aptana_Studio 介绍和应用
    linux root命令忘记以及挂载U盘
    程序员创业生死一线 最后归宿在哪里?
    如何使用Log4j? .
  • 原文地址:https://www.cnblogs.com/tianjiaxiaobaicai/p/7826794.html
Copyright © 2011-2022 走看看