ABP框架系列之三十八:(NHibernate-Integration-NHibernate-集成)
ASP.NET Boilerplate can work with any O/RM framework. It has built-in integration with NHibernate. This document will explain how to use NHibernate with ASP.NET Boilerplate. It's assumed that you're already familar with NHibernate in a basic level.
ASP.NET样板可以与任何O / RM工作框架。它具有内置的集成NHibernate。本文档将解释如何使用NHibernate与ASP.NET样板。假定你已经熟悉了基本NHibernate。
Nuget package
Nuget package to use NHibernate as O/RM in ASP.NET Boilerplate is Abp.NHibernate. You should add it to your application. It's better to implement NHibernate in a seperated assembly (dll) in your application and depend on that package from this assembly.
NuGet包使用NHibernate在ASP.NET样板的O / RM是Abp.NHibernate。你应该把它添加到你的应用程序。最好是在一个分离的组件实现NHibernate(DLL)在你的应用和依赖,从这个组件包。
Configuration
To start using NHibernate, you should configure it in PreInitialize of your module.
[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());
}
}
AbpNHibernateModule module provides base functionality and adapters to make NHibernate work with ASP.NET Boilerplate.
Entity mapping
In this sample configuration above, we have fluently mapped using all mapping classes in current assembly. An example mapping class can be as shown below:
在上面的示例配置中,我们使用当前程序集中的所有映射类进行了流畅的映射。一个示例映射类可以如下所示:
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 is a class of ASP.NET Boilerplate that extends ClassMap<T>, automatically maps Id property and gets table name in the constructor. So, I'm deriving from it and mapping other properties using FluentNHibernate. Surely, you can derive directly from ClassMap, you can use full API of FluentNHibernate and you can use other mapping techniques of NHibernate (like mapping XML files).
entitymap是一类ASP.NET样板延伸ClassMap <T>,自动地图ID属性在构造函数和获取表名。所以,我从它的其他性能和使用fluentnhibernate映射。当然,你可以直接来自ClassMap,您可以使用完整的API,你可以使用fluentnhibernate NHibernate其他映射技术(如XML文件)。
Repositories
Repositories are used to abstract data access from higher layers. See repository documentation for more. 存储库用于从高层抽象数据访问。
Default Implementation
Abp.NHibernate package implements default repositories for entities in your application. You don't have to create repository classes for entities to just use predefined repository methods.
abp.nhibernate包实现应用程序中的实体的默认库。您不必为实体创建存储库类,只使用预定义的存储库方法。
Example:
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 contructor-injects IRepository<Person> and uses the Insert method. In this way, you can easily inject IRepository<TEntity> (or IRepository<TEntity, TPrimaryKey>) and use predefined methods. Seerepository documentation for list of all predefined methods.
Custom Repositories
If you want to add some custom method, you should first add it to a repository interface (as a best practice), then implement in a repository class. ASP.NET Boilerplate provides a base class NhRepositoryBase to implement repositories easily. To implement IRepository interface, you can just derive your repository from this class.
如果您想添加一些自定义方法,您应该首先将其添加到存储库接口(作为最佳实践),然后在存储库类中实现。ASP.NET的模板提供了一个基类库nhrepositorybase实现容易。实施IRepository接口,你可以从这个类派生你的库。
Assume that we have a Task entity that can be assigned to a Person (entity) and a Task has a State (new, assigned, completed... and so on). We may need to write a custom method to get list of Tasks with some conditions and with AssisgnedPerson property pre-fetched in a single database query. See the example code:
假设我们有一个任务实体可以分配给一个人(实体),任务有一个状态(新的,分配的,完成的)…等等)。我们需要写一个获得有条件的任务列表的自定义方法和assisgnedperson预取在一个单一的数据库查询了。请参见示例代码:
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() returns IQueryable<Task>, then we can add some Where filters using given parameters. Finally we can call ToList() to get list of Tasks.
You can also use Session object in repository methods to use full API of NHibernate.
Note: Define the custom repository interface in the domain/core layer, implement it in the NHibernate project for layered applications. Thus, you can inject the interface from any project without referencing to NH.
注:定义域/核心层的自定义库的接口,实现在NHibernate项目分层中的应用。因此,您可以在不引用NH的情况下从任何项目注入接口。
Application Specific Base Repository Class
Although you can derive your repositories from NhRepositoryBase of ASP.NET Boilerplate, it's a better practice to create your own base class that extends NhRepositoryBase. Thus, you can add shared/common methods to your repositories easily. Example:
虽然你可以导出你的库从ASP.NET样板nhrepositorybase,创建自己的基类,延伸nhrepositorybase这是一个更好的实践。因此,您可以轻松地将共享/共享方法添加到存储库中。例子:
//Base class for all repositories in my application
public abstract class MyRepositoryBase<TEntity, TPrimaryKey> : NhRepositoryBase<TEntity, TPrimaryKey>
where TEntity : class, IEntity<TPrimaryKey>
{
protected MyRepositoryBase(ISessionProvider sessionProvider)
: base(sessionProvider)
{
} //add common methods for all repositories
} //A shortcut for entities those have integer Id.
public abstract class MyRepositoryBase<TEntity> : MyRepositoryBase<TEntity, int>
where TEntity : class, IEntity<int>
{
protected MyRepositoryBase(ISessionProvider sessionProvider)
: base(sessionProvider)
{
} //do not add any method here, add the class above (since this inherits it)
} public class TaskRepository : MyRepositoryBase<Task>, ITaskRepository
{
public TaskRepository(ISessionProvider sessionProvider)
: base(sessionProvider)
{
} //Specific methods for task repository
}
ABP框架系列之三十八:(NHibernate-Integration-NHibernate-集成)的更多相关文章
- ABP框架系列之三十四:(Multi-Tenancy-多租户)
What Is Multi Tenancy? "Software Multitenancy refers to a software architecture in which a sing ...
- ABP框架系列之三十二:(Logging-登录)
Server Side(服务端) ASP.NET Boilerplate uses Castle Windsor's logging facility. It can work with differ ...
- ABP框架系列之三十九:(NLayer-Architecture-多层架构)
Introduction Layering of an application's codebase is a widely accepted technique to help reduce com ...
- ABP框架系列之十八:(Data-Transfer-Objects-数据转换对象)
Data Transfer Objects are used to transfer data between Application Layer and Presentation Layer. 数据 ...
- ABP框架系列之四十八:(Specifications-规范)
Introduction Specification pattern is a particular software design pattern, whereby business rules c ...
- ABP框架系列之三十五:(MVC-Controllers-MVC控制器)
Introduction ASP.NET Boilerplate is integrated to ASP.NET MVC Controllers via Abp.Web.Mvc nuget pack ...
- ABP框架系列之三十六:(MVC-Views-MVC视图)
Introduction ASP.NET Boilerplate is integrated to MVC Views via Abp.Web.Mvc nuget package. You can c ...
- ABP框架系列之三十:(Javascript-API-Javascript-API)
ASP.NET Boilerplate provides a set of objects and functions that are used to make javascript develop ...
- ABP框架系列之五十四:(XSRF-CSRF-Protection-跨站请求伪造保护)
Introduction "Cross-Site Request Forgery (CSRF) is a type of attack that occurs when a maliciou ...
随机推荐
- 使用虚拟化KVM安装RHEL7系统
使用虚拟化KVM安装RHEL7系统 作者:Eric 微信:loveoracle11g 检查真实物理机是否支持虚拟化功能 [root@server ~]# grep vmx /proc/cpuinfo ...
- Linux集群之keepalive+Nginx
集群从功能实现上分高可用和负载均衡: 高可用集群,即“HA"集群,也常称作“双机热备”. 当提供服务的机器宕机,备胎将接替继续提供服务: 实现高可用的开源软件有:heartbeat.keep ...
- Getting started - RN1
0. down yarn https://yarnpkg.com 1. Expo Cli 此环境用于开发或学习之用. (1)install npm install -g expo-cli (2) us ...
- Oracle导出表数据与导入表数据dmp,以及导入导出时候常见错误
使用DOS 操作界面导出表数据,导入表数据(需要在数据库所在的服务器上边执行) exp UserName/Password@192.168.0.141/orcl file=d:\xtables.d ...
- Java并发编程三个性质:原子性、可见性、有序性
并发编程 并发程序要正确地执行,必须要保证其具备原子性.可见性以及有序性:只要有一个没有被保证,就有可能会导致程序运行不正确 线程不安全在编译.测试甚至上线使用时,并不一定能发现,因为受到当时的 ...
- (9/24) 图片跳坑大战--css分离与图片路径处理
前言: 在上一节当中,我们把小图片打包成Base64格式(打包到了js当中).我们也算是对webpack对图片的打包有个基本了解. 本节我们准备把css从JavasScript代码中分离出来,这会遇到 ...
- centos 7设置本地yum资源库
前言 同样的,是在这两天安装ambari的时候遇到的问题之一,那就是关于centos的本地yum源的制作,当时是一种是制作iso镜像的yum源,还有一种将rpm软件包打成压缩包上传到centos的某一 ...
- zabbix监控内存占前3位的进程信息
一.编写shell脚本 ps aux|sort -k4nr|head -3|awk 'split($11,a,"/"){print $4","a[length( ...
- mysql修改密码方法
1. 修改密码有三种方法:1.1 ---->用mysqladmin修改密码格式:mysqladmin -u用户名 -p旧密码 password 新密码 例子:# mysqladmin -uroo ...
- lambda正则化参数的大小影响
当lambda的值很小时,其惩罚项值不大,还是会出现过拟合现象,当时lambda的值逐渐调大的时候,过拟合现象的程度越来越低,但是当labmda的值超过一个阈值时,就会出现欠拟合现象,因为其惩罚项太大 ...