一,仓储定义:“在领域层和数据映射层的中介,使用类似集合的接口来存取领域对象”
(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

  

最新文章

  1. MySQL常用SQL总结
  2. 关于UIView布局的总结
  3. 运行时报错:java.net.BindException: Address already in use: JVM_Bind &lt;null&gt;:8080 (或8009或8005)
  4. Linux服务器jps报process information unavailable
  5. Css 备忘知识点
  6. nginx日志分割脚本
  7. eclipse技巧总结
  8. Nginx/LVS/HAProxy负载均衡软件的优缺点详解
  9. [Ogre]纹理设置
  10. s3c6410_时钟初始化
  11. win10 删除资源管理器中的6个文件夹
  12. WinEdit7 破解方法
  13. Spring之Spring MVC
  14. Transaction: atomicity, consistency, separability, persistence
  15. MAC OSX使用篇
  16. Linux 上Oracle RAC 10g 升级到 Oracle RAC 11g
  17. Cocos2d-x官方在线视频-Cocos2d-x3.2《2048》手游开发揭秘
  18. hdu1896之优先队列应用
  19. Vuejs-组件-&lt;slot&gt; 标签分发内容
  20. 关于APIcloud中的登录与注册的简单实现

热门文章

  1. js 利用数组实现类似于asp中的数据字典
  2. Redis入门教程(C#)
  3. SL 的 DATAGRID中如何加入计算列?
  4. c# 求第30位数的值
  5. dpdk EAL: Error reading from file descriptor 23: Input/output error
  6. 隐藏导航栏,偏移20PX
  7. C# 中out,ref,params参数的使用
  8. (转)测试rootvg卷组的镜像的官方做法
  9. 泛型深入--java泛型的继承和实现、泛型擦除
  10. addEventListener和attachEvent的区别 分类: JavaScript 2015-05-12 19:03 702人阅读 评论(0) 收藏