ABP理论学习之NHibernate集成
返回总目录
本篇目录
- 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集成相关推荐
- ABP理论学习之Web API控制器(新增)
返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...
- ABP理论学习之工作单元(Unit of Work)
本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IReposito ...
- ABP理论学习之授权(Authorization)
返回总目录 本篇目录 介绍 定义权限 检查权限 使用AbpAuthorize特性 使用IPermissionChecker Razor视图 客户端(Javascript) 权限管理者 介绍 几乎所有的 ...
- ABP理论学习之仓储
本篇目录 IRepository接口 查询 插入 更新 删除 其他 关于异步方法 仓储实现 管理数据库连接 仓储的生命周期 仓储最佳实践 Martin Fowler对仓储的定义 位于领域层和数据映射层 ...
- ABP理论学习之依赖注入
返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...
- ABP理论学习之日志记录
本篇目录 服务端 获取Logger 基类中的Logger 配置 客户端 服务端 ABP使用的是Castle Windsor的日志记录设备.它可以和不同的日志类库一起工作,比如Log4Net,NLog, ...
- Solr.NET快速入门(七)【覆盖默认映射器,NHibernate集成】
覆盖默认映射器 默认情况下,SolrNet使用属性映射Solr字段. 但是,您可能需要使用另一个映射程序. 替换默认映射器取决于您如何设置库: 内置容器 如果使用默认的内置容器,可以在调用Startu ...
- ABP理论学习之Abp Session
返回总目录 本篇目录 介绍 注入Session 使用Session属性 介绍 当应用程序要求用户登录时,那么应用程序也需要知道当前用户正在执行的操作.虽然ASP.NET本身在展现层提供了Session ...
- ABP理论学习之本地化
本篇目录 应用语言 本地化资源 获取本地化文本 扩展本地化资源 最佳实践 应用语言 一个应用至少有一种UI语言,许多应用不止有一种语言.ABP为应用提供了一个灵活的本地化系统. 第一件事情就是声明支持 ...
最新文章
- mysql 查询实体_mysql – 如何优化实体框架查询
- Vue-resource中post请求将data数据以request payload转换为form data的形式
- android 带图片的弹幕,一个可以支持文本,图片,文本+表情的简单弹幕插件
- python0x80070643_Win10提示Python 0x80070643安装时发生严重错误
- 广西工学院2000级计算机系,广西工学院管理系信管教研室李明 - 欢迎访问广西科技大学.ppt...
- 问题:lapack.so
- .NET简谈设计模式之(命令模式)
- .NET中变量生存期
- 移动端安全 - 安卓Android - 工具相关
- php如何实现记录步数,微信步数获取-PHP后端部分
- xshell 4 中文乱码问题解决
- NFL计划将数据跟踪芯片放入橄榄球中
- sasl java_kafka sasl java api
- js打印window.print()图片打印
- 电脑连不上网,WiFi没有显示出来
- DLNA的几个小实验
- python3中seed函数的用法
- 图片大小/像素/分辨率之间有什么关系
- 教妹学 Java:大有可为的集合
- 数据结构与算法是什么?
热门文章
- 图像数集据增广的15+种功能总结和Python代码实现
- oracle报27040错误,【oracle案例】创建表空间时遇到 ORA-01119,0RA-27040,0SD-04002
- python ttk.notebook_python – 无法在ttk.Notebook中看到所有选项卡
- clr错误 8004005程序将立即终止_微软公开发布更多Surface驱动程序 固件支持终止日期...
- html range 样式,美化 input range 控制条
- 累积分布函数_正态累积分布函数的上下界和两个近似初等函数
- 【Maven篇】---解决Maven线上部署java.lang.ClassNotFoundException和no main manifest attribute解决方法...
- JVM调优及调优参数详解
- 【比原链】比原启动后去哪里连接别的节点
- Android 新一代多渠道打包神器