An Introduce to NHibernate PART 1 J九日
内容 SQL Helper vs. NHibernate Object-Relational Mapping 关系模型 为什么使用 ORM? Hibernate 含义 NHibernate Mapping 核心类型 Exercise: ExBlogger
SQL Helper vs. NHibernate Working with SQL Helper 上层应用/Business Logic 太暧昧 创建数据对象 编写SQL 设计数据模型 以数据表为核心 模型仅为装载数据 底层可能包含业务逻辑 底层与上层关系紧密 受PetShop4的影响 设计数据表 前期的设计很 可能面目全非 “Data-Driven Design”
SQL Helper vs. NHibernate Working with NHibernate 各种应用程序 解决O-R不对称,转移主要关注点! 设计应用服务契约 Cache 设计业务领域对象 Search 设计资源库契约 NoSQL 以业务对象为核心 资源库不关心业务逻辑 应用层不关心契约实现 促进面向契约编程 NHibernate 资源库实现 设计数据表 Domain-Driven Design
Object-Relational Mapping Relational Model Relation Relation Relation
Object-Relational Mapping Relational Model Concepts 关系数据库(Relational Database)是建立在关系模型上的数据库; 一个数据表“就是”一个关系(Relation); 表(关系)之间通过“键”连接;
Object-Relational Mapping Why ORM ? Modeling mismatch Productivity and maintainability Performance Database independency ORM
Hibernate Hibernate: 休眠、冬眠 活动的熊 冬眠的熊 Hibernate
对象 关系 活动的熊 冬眠的熊 让开发者更关注对象的设计! Hibernate 关注点 Hibernate: Java Hibernate: a Java ORM Framework 对象 关系 Hibernate 活动的熊 冬眠的熊 Hibernate 关注点 Hibernate: Java 让开发者更关注对象的设计! NHibernate: .NET
NHibernate Mapping Mapping 嵌入的资源
…… Core NHibernate Types Build (Once) ISessionFactory Configuration Open Session ISession ISession …… Create IQuery ISQLQuery ICriteria IQueryOver IQueryable HQL SQL Dynamically LINQ
配置文件 Core NHibernate Types NHibernate.Cfg.Configuration Configuration Configure() Configuration Configure(string fileName) Configuration Configure(Assembly assembly, string resourceName) Configuration Configure(XmlReader textReader) // 构建 ISessionFactory 的实例 ISessionFactory BuildSessionFactory() 配置文件
Core NHibernate Types NHibernate.ISessionFactory //Create a database connection and open a <c>ISession</c> on it ISession OpenSession() ISession OpenSession(IDbConnection conn) ISession OpenSession(IInterceptor sessionLocalInterceptor) NHibernate.ISession object Save(object obj) void Delete(object obj) void Update(object obj) ICriteria CreateCriteria<T>() IQueryOver<T,T> QueryOver<T>() IQuery CreateQuery(string queryString) ISQLQuery CreateSQLQuery(string queryString) IQueryable<T> Query<T>(this ISession session)
Core NHibernate Types ISession查询示例:查询所有用户 Criteria Query Session.CreateCriteria<User>().List<User>(); Strong-typed Criteria Query Session.QueryOver<User>().List<User>(); NHibernate Linq Query Session.Query<User>().ToList<User>(); Query with Hibernate Query Language Session.CreateQuery("from User").List<User>(); Native SQL Query Session.CreateSQLQuery("select * from Users") .SetResultTransformer(Transformers.AliasToBean<User>()) .List<User>();
访客可以注册成用户 用户可以创建自己的博客 用户可以在自己的博客里写帖子 用户可以评论帖子 使用NHibernate框架持久化对象 Exercise:ExBlogger 目标:多用户博客程序 访客可以注册成用户 用户可以创建自己的博客 用户可以在自己的博客里写帖子 用户可以评论帖子 使用NHibernate框架持久化对象
Exercise:ExBlogger 访客 博客 注册 创建 博客用户 帖子 写 发表 评论
Exercise:ExBlogger Visitor Blog User Post Comment Register Create Ubiquitous Language 领域通用语言 Comment
Exercise:ExBlogger 应用服务契约的制定与测试(略) 已确定对象的创建工厂 已确定对象的职责 下一步:制定/实现资源库契约(Repository Contracts/Interfaces)
Exercise:ExBlogger IRepository<T> int Save(T entity); void Update(T entity); T Get(int id); IList<T> GetAll(); void Delete(int id); 通用持久化方法 IUsersRepository:IRepository<User> IBlogsRepository:IRepository<Blog> 自定义持久化方法 IPostsRepository:IRepository<Post> ICommentsRepository:IRepository<Comment>
Exercise:ExBlogger 创建并存储用户 var user = BlogRegistrar.GetInstance().CreateUser(“Mike", "pwd"); var id = _usersRepository.Save(user); 获取所有用户 var users = _usersRepository.GetAll();
Exercise:ExBlogger 创建并存储博客 var blog = user.CreateBlog("foo", "bar"); _blogsRepository.Save(blog); 创建并存储帖子 var post = user.CreatePost("Hello World", "This my first post!") .On(blog); _postsRepository.Save(post);
Exercise:ExBlogger 创建并存储评论 var comment = user.CreateComment("沙发").On(post); _commentsRepository.Save(comment); 获取评论列表:组装自定义的DTO
Thanks ! 示例代码SVN地址: http://ex-blogger.googlecode.com/svn/trunk/ 推荐资料: 李永京博客 http://www.cnblogs.com/lyj/ 领域驱动设计精简版 http://www.infoq.com/cn/minibooks/domain-driven-design-quickly