• Asp.Net大型项目实践(4)用NHibernate保存和查询我们的业务领域对象


      关于NHibernate的相关资料不是很多,关于它在.Net项目中的实际应用的资料就更少了,在开始用NHibernate的时候也走了不少弯路,到现在自我感觉能在项目中合理应用NHibernate了。这里要感谢下同事1-2-3,关于NHibernate应用的不少技术细节问题基本都靠他努力解决的。也感谢李永京的NHibernate之旅系列文章导航,在入门初期省去了我阅读英文文档的麻烦,感谢了两位之后貌似NHibernate这块就没我啥事了...汗
    注:额外说一下 目前.Net下可用使用ORM工具不少,但我个人觉得NHibernate是目前.Net下最强大最好用的ORM工具,这里我不想挑起.Net ORM框架之争,如果要争也希望大家在项目中实际应用之后再说,别老说什么NHibernate XML配置麻烦,效率低之类的 没有前提的无聊的话。至少在我的项目里正因为有了NHibernate才能使我可以比较OO的去建我的业务领域对象,貌似更加接近传说中的真正的所谓对象关系映射....

    1. 同样按照国际惯例,我们应该建立一个统一的一般的数据库访问接口
      代码
      namespace Demo.HIS.FrameWork.Repository
      {
      public interface IRepository<T> where T:Entity
      {
      T Load(
      string id);
      T Get(
      string id);
      IList
      <T> GetAll();
      void SaveOrUpdate(T entity);
      void Update(T entity);
      void Delete(string id);
      void PhysicsDelete(string id);
      }
      }

      a.大家应该通过这些接口方法的名字就应该猜出其中的含义了吧?什么获取一个对象,保存对象,删除对象,获取一个List...
      b. public interface IRepository<T> where T:Entity 这个写法的意思表示泛型对象T只允许是继承于Entity基类的对象,还记得Entity吗?Asp.Net大型项目实践(3)-业务领域对象建模这篇里有讲到的,Entity是系统中所有可以被持久到数据库的业务对象都应该继承的基类,这样写可以避免你传一些阿猫阿狗的类型给我叫我给你Save,Delete....
      c.Load和Get的命名和NHibernate有关 ,以后会讲到,心急的同学可以google“Hibernate Get Load 区别”
      d.Delete和PhysicsDelete ,上一篇有讲到 我们系统中默认删除为逻辑删除,所以物理删除属于“变态”特别命名
      e.有的同学看到接口设计的这么简单估计没兴趣看下去了...别急,咱分页,排序,多条件组合查询,多表查询等等典型应用场景一个不缺 请的慢慢看下去..有图有真相:

    2. 有了IRepository接口 我们就可以写针对这个接口的具体是实现了 因为我们是用NHibernate实现所以我们建一个这样的类
      代码
      namespace Demo.HIS.FrameWork.Repository.Nhb
      {
      public class RepositoryNhbImpl<T> : IRepository<T> where T : Entity
      {

      #region IRepository<T> 成员

      public T Load(string id)
      {
      throw new NotImplementedException();
      }

      public T Get(string id)
      {
      throw new NotImplementedException();
      }

      public IList<T> GetAll()
      {
      throw new NotImplementedException();
      }

      public void SaveOrUpdate(T entity)
      {
      throw new NotImplementedException();
      }

      public void Update(T entity)
      {
      throw new NotImplementedException();
      }

      public void Delete(string id)
      {
      throw new NotImplementedException();
      }

      public void PhysicsDelete(string id)
      {
      throw new NotImplementedException();
      }

      #endregion
      }
      }
      如果你是想用Linq去实现数据库的访问 那你就建立个“public class RepositoryLinqImpl<T> : IRepository<T> where T : Entity ”类,不过要是这样的话你就没啥必要继续看下去了,因为下面的基本和Linq没啥事.....
    3. 插一句,下面的内容涉及到较多NHibernate技术细节,建议先去把李永京大哥的NHibernate之旅系列文章导航大概过一遍再来接着看,否则不大容易看懂,不过我尽量写的详细一点,至少做到让大家理解,写完也会贴上源码供大家参考 源码在下一篇下载
  • 相关阅读:
    关于Git的一些常规操作
    .Net 常用ORM框架对比:EF Core、FreeSql、SqlSuger (下篇)
    Myeclipse打开许多JSP文件或者js文件之后非常卡-------的解决办法
    单点登录常用生成token的操作-----UUID.randomUUID().toString() 简介
    如何使用时间复杂度和空间复杂度来区分算法的效率?
    自定义注解的简单使用
    企业中常用的Git和Svn比较。
    框架中常见的注解分析
    处理大数据流常用的三种Apache框架:Storm、Spark和Samza。(主要介绍Storm)
    养生食谱
  • 原文地址:https://www.cnblogs.com/legendxian/p/1631672.html
Copyright © 2020-2023  润新知