返回总目录


本篇目录

  • Nuget包
  • 配置
    • 实体映射
  • 仓储
    • 仓储基类
    • 实现仓储
    • 自定义仓储方法
  • 阅读其他

ABP可以使用任何ORM框架工作,并且已经内置了NHibernate集成。这篇文章会解释如何在ABP中使用NHibernate。阅读本文的前提是假设你已经熟悉了EF的基本知识。

Nuget包

在ABP中使用NH作为ORM的Nuget包是Abp.NHibernate。你应该将它添加到应用程序中。最好在应用程序中分离的程序集(dll)中实现NHibernate,并让该程序集依赖Abp.NHibernate包。

配置

要开始使用NHibernate,应该首先要配置它。配置代码应该写在模块的PreInitialize方法中。

[DependsOn(typeof(AbpNHibernateModule))]
public class SimpleTaskSystemDataModule : AbpModule
{public override void PreInitialize(){var connStr = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;Configuration.Modules.AbpNHibernate().FluentConfiguration.Database(MsSqlConfiguration.MsSql2008.ConnectionString(connStr)).Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()));}public override void Initialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());}
}

AbpNHibernate模块为了使ABP能够使用NHibernate工作提供了基本的功能和适配器。

实体映射

在下面的样例配置中,使用了当前程序集中的所有映射类进行了流畅地映射。一个映射类的例子如下所示:

public class TaskMap : EntityMap<Task>
{public TaskMap(): base("TeTasks"){References(x => x.AssignedUser).Column("AssignedUserId").LazyLoad();Map(x => x.Title).Not.Nullable();Map(x => x.Description).Nullable();Map(x => x.Priority).CustomType<TaskPriority>().Not.Nullable();Map(x => x.Privacy).CustomType<TaskPrivacy>().Not.Nullable();Map(x => x.State).CustomType<TaskState>().Not.Nullable();}
}

EntityMap是ABP继承了 ClassMap的一个类,它会自动映射 Id属性并在构造函数中获得表名。因此,我们可以从它派生并使用 FluentNHibernate映射其他的属性。当然,你可以直接从ClassMap派生,可以使用FluentNHibernate的所有API,也可以使用NHinernate其他的映射技术(比如映射XML文件)。

仓储

你可以使用仓储的默认实现而不用在项目中创建仓储类。或者可以创建派生自NhRepositoryBase的仓储类。

仓储基类

虽然可以从ABP的NhRepositoryBase中派生仓储类,但是最佳实践是创建自己的继承了NhRepositoryBase的基类。这样,我们就可以轻松地将一些公用的方法添加到仓储中了。例子如下:

//所有仓储的基类
public abstract class MyRepositoryBase<TEntity, TPrimaryKey> : NhRepositoryBase<TEntity, TPrimaryKey>where TEntity : class, IEntity<TPrimaryKey>
{protected MyRepositoryBase(ISessionProvider sessionProvider): base(sessionProvider){}//为所有的仓储添加一些公共的方法
}//Id为整数的实体的快捷方式
public abstract class MyRepositoryBase<TEntity> : MyRepositoryBase<TEntity, int>where TEntity : class, IEntity<int>
{protected MyRepositoryBase(ISessionProvider sessionProvider): base(sessionProvider){}//不要在这里添加任何方法,在上面的方法中添加(因为该方法继承了上面的方法)
}public class TaskRepository : MyRepositoryBase<Task>, ITaskRepository
{public TaskRepository(ISessionProvider sessionProvider): base(sessionProvider){}//这里添加一些task仓储特有的方法
}

默认实现

你不需要为实体类创建仓储,只需要使用预定义的仓储方法。例子:

public class PersonAppService : IPersonAppService
{private readonly IRepository<Person> _personRepository;public PersonAppService(IRepository<Person> personRepository){_personRepository = personRepository;}public void CreatePerson(CreatePersonInput input){        person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };_personRepository.Insert(person);}
}

PersonAppService通过构造函数注入了IRepository并使用仓储中的Insert方法。使用这种方法,你可以轻松地注入 IRepository(或者IRepository<TEntity,TPrimaryKey>),然后使用预定义的方法。所有预定义的方法列表,请查看仓储文档

自定义仓储方法

如果你想添加一些自定义的方法,那么首先应该给它添加仓储接口(这是最佳实践),然后在仓储类中实现。ABP提供了一个基类NhRepositoryBase来轻松地实现仓储。要实现仓储接口,只需要从仓储基类中派生仓储就可以了。

假设我们有一个Task(任务)实体,该任务可以派给一个Person(人)实体,而且Task实体有这么几种状态,包括new,assigned,completed等等。我们可能需要写一个自定义方法来根据一些条件和AssignedPerson来获取任务的列表。看下面的代码:

public interface ITaskRepository : IRepository<Task, long>
{List<Task> GetAllWithPeople(int? assignedPersonId, TaskState? state);
}public class TaskRepository : NhRepositoryBase<Task, long>, ITaskRepository
{public TaskRepository(ISessionProvider sessionProvider): base(sessionProvider){}public List<Task> GetAllWithPeople(int? assignedPersonId, TaskState? state){var query = GetAll();if (assignedPersonId.HasValue){query = query.Where(task => task.AssignedPerson.Id == assignedPersonId.Value);}if (state.HasValue){query = query.Where(task => task.State == state);}return query.OrderByDescending(task => task.CreationTime).Fetch(task => task.AssignedPerson).ToList();}
}

GetAll()方法返回了IQueryable,然后使用给定的参数添加了一些 Where过滤。最后使用 ToList()获得Tasks的列表。

你也可以在仓储方法中使用Session对象来调用NHibernate的全部API。

仓储应该在它的构造函数中获得一个ISessionProvider。这样的话,我们就可以在单元测试中轻松地注入一个伪造的session提供者了。在运行时,ABP会自动地注入正确的session提供者。

阅读其他

你也可以查看仓储文档获取更多关于仓储的知识。

转载于:https://www.cnblogs.com/farb/p/ABPNHibernate.html

ABP理论学习之NHibernate集成相关推荐

  1. ABP理论学习之Web API控制器(新增)

    返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...

  2. ABP理论学习之工作单元(Unit of Work)

    本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IReposito ...

  3. ABP理论学习之授权(Authorization)

    返回总目录 本篇目录 介绍 定义权限 检查权限 使用AbpAuthorize特性 使用IPermissionChecker Razor视图 客户端(Javascript) 权限管理者 介绍 几乎所有的 ...

  4. ABP理论学习之仓储

    本篇目录 IRepository接口 查询 插入 更新 删除 其他 关于异步方法 仓储实现 管理数据库连接 仓储的生命周期 仓储最佳实践 Martin Fowler对仓储的定义 位于领域层和数据映射层 ...

  5. ABP理论学习之依赖注入

    返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...

  6. ABP理论学习之日志记录

    本篇目录 服务端 获取Logger 基类中的Logger 配置 客户端 服务端 ABP使用的是Castle Windsor的日志记录设备.它可以和不同的日志类库一起工作,比如Log4Net,NLog, ...

  7. Solr.NET快速入门(七)【覆盖默认映射器,NHibernate集成】

    覆盖默认映射器 默认情况下,SolrNet使用属性映射Solr字段. 但是,您可能需要使用另一个映射程序. 替换默认映射器取决于您如何设置库: 内置容器 如果使用默认的内置容器,可以在调用Startu ...

  8. ABP理论学习之Abp Session

    返回总目录 本篇目录 介绍 注入Session 使用Session属性 介绍 当应用程序要求用户登录时,那么应用程序也需要知道当前用户正在执行的操作.虽然ASP.NET本身在展现层提供了Session ...

  9. ABP理论学习之本地化

    本篇目录 应用语言 本地化资源 获取本地化文本 扩展本地化资源 最佳实践 应用语言 一个应用至少有一种UI语言,许多应用不止有一种语言.ABP为应用提供了一个灵活的本地化系统. 第一件事情就是声明支持 ...

最新文章

  1. mysql 查询实体_mysql – 如何优化实体框架查询
  2. Vue-resource中post请求将data数据以request payload转换为form data的形式
  3. android 带图片的弹幕,一个可以支持文本,图片,文本+表情的简单弹幕插件
  4. python0x80070643_Win10提示Python 0x80070643安装时发生严重错误
  5. 广西工学院2000级计算机系,广西工学院管理系信管教研室李明 - 欢迎访问广西科技大学.ppt...
  6. 问题:lapack.so
  7. .NET简谈设计模式之(命令模式)
  8. .NET中变量生存期
  9. 移动端安全 - 安卓Android - 工具相关
  10. php如何实现记录步数,微信步数获取-PHP后端部分
  11. xshell 4 中文乱码问题解决
  12. NFL计划将数据跟踪芯片放入橄榄球中
  13. sasl java_kafka sasl java api
  14. js打印window.print()图片打印
  15. 电脑连不上网,WiFi没有显示出来
  16. DLNA的几个小实验
  17. python3中seed函数的用法
  18. 图片大小/像素/分辨率之间有什么关系
  19. 教妹学 Java:大有可为的集合
  20. 数据结构与算法是什么?

热门文章

  1. 图像数集据增广的15+种功能总结和Python代码实现
  2. oracle报27040错误,【oracle案例】创建表空间时遇到 ORA-01119,0RA-27040,0SD-04002
  3. python ttk.notebook_python – 无法在ttk.Notebook中看到所有选项卡
  4. clr错误 8004005程序将立即终止_微软公开发布更多Surface驱动程序 固件支持终止日期...
  5. html range 样式,美化 input range 控制条
  6. 累积分布函数_正态累积分布函数的上下界和两个近似初等函数
  7. 【Maven篇】---解决Maven线上部署java.lang.ClassNotFoundException和no main manifest attribute解决方法...
  8. JVM调优及调优参数详解
  9. 【比原链】比原启动后去哪里连接别的节点
  10. Android 新一代多渠道打包神器