Asp.net MVC 示例项目"Suteki.Shop"分析之---NHibernate

简介:
  在Suteki.Shop中内置了提供了基于NHibernate方式的ORM功能,只不过就目前的项目进度还未全完成其设计时的构想,另外在单元测试上也没有完整的测试。不过其设计思路还是很有意思的。
 
       就其将NHibernate引入到项目中的实现方式而言,与Rhino.Commons中所提倡的方式如出一辙,那就是基于IRepository模式。关于IRepository这个接口的定义在之前的这篇文章中已提到并做了相应说
明,所以这里就不多做解释了。
 
       好了,下面就开始今天的正文。
       首先让我们看一下这个类图:

    
        
         左侧的类NHibernateRepository就是基于IRepository 基本的具体实现,也就是所谓的CRUD操作。下面就是其具体实现代码:
 
public   class  NHibernateRepository < T >  : IRepository < T > , IRepository  where  T :  class
{
    
private   readonly  ISessionManager sessionManager;

    
public  NHibernateRepository(ISessionManager sessionManager)
    {
        
this .sessionManager  =  sessionManager;
    }

    
private  ISession Session
    {
        
get
        {
            
return  sessionManager.OpenSession();
        }
    }

    
public  T GetById( int  id)
    {
        
return  Session.Load < T > (id);
    }

    
public  IQueryable < T >  GetAll()
    {
        
return  Session.Linq < T > ();
    }

    
public   void  InsertOnSubmit(T entity)
    {
        Session.Save(entity);
    }

    
public   void  DeleteOnSubmit(T entity)
    {
        Session.Delete(entity);
    }

    
public   void  SubmitChanges()
    {
        Session.Flush();
    }

    
object  IRepository.GetById( int  id)
    {
        
return  GetById(id);
    }

    IQueryable IRepository.GetAll()
    {
        
return  GetAll();
    }

    
void  IRepository.InsertOnSubmit( object  entity)
    {
        InsertOnSubmit((T)entity);
    }

    
void  IRepository.DeleteOnSubmit( object  entity)
    {
        DeleteOnSubmit((T)entity);
    }
}
    
         该类的构造方法中接收ISessionManager实例做为其会话管理器。在castle中提供了"NHibernateIntegration"对NHibernate进行了集成,对Session和Transaction进行了封装。所以这里可以使用该ISessionManager对Model中的数据对象进行所谓的CRUD操作。因为这里还使用了NHibernate.Linq.dll,以此来替代Linq to Sql,所以其余的代码比较与Linq有些相似,这里就不多做说明了。

        下面再看一下NHibernateEntityTypeResolver(Suteki.Common\Services\NHibernateEntityTypeResolver.cs),其功能就是将指定的Model中的指定实体类映影成NHibernate中的Entity,下面是其具体实现:
 
public   class  NHibernateEntityTypeResolver : IEntityTypeResolver
{
    
public  Type GetTypeOf(IEntity entity)
    {
        
return  NHibernateProxyHelper.GuessClass(entity);
    }

    
public  Type GetRealTypeOf(Type type)
    {
        var nhibernateProxyInterface 
=  type.GetInterface( " INHibernateProxy " );
        
if (nhibernateProxyInterface  ==   null )
        {
            
return  type;
        }

        
return  type.BaseType;
    }
}
   
        有了这两个类就可以在项目中使用它们了。只不过目前Suteki.Shop还未实现NHibernate方式的ORM,所以还未进行单元测试。不过作者在其BLOG中还是在 这篇文章中提供了一个 示例,来测试运行NHibernateRepository 中的功能。    
        下面就有这个示例来看一下其具体的测试代码。首先下载并解压该示例的ZIP文件,并修改其中的config文件"Keith.WindsorHNibernate.Tests.dll.Windsor.config",找出里面的数据连接串,替换成为我们本地的数据库链接。
        下面我们就看一下其中的测试代码:     
 
[TestFixture]
 
public   class  RepositoryTests : WindsorNHibernateContainerTest
 {
     
private  IRepository < Customer >  customerRepository;

     [SetUp]       
     
public   void  SetUp()
     {
         customerRepository 
=  GetComponet < IRepository < Customer >> ();
     }

     [Test]
     
public   void  Customer_RepositoryShouldNotBeNull()
     {
         var customers 
=  customerRepository.GetAll();
         
         
foreach  (var customer  in  customers)
         {
             Console.WriteLine(
" Customer: {0} " , customer.ContactName);

             
foreach  (var order  in  customer.Orders)
             {
                 Console.WriteLine(
" \tOrder: {0} " , order.OrderID);
             }
         }
         Assert.That(customers, Is.Not.Null);
     }
    
          这个示例中链接的数据库为Northwind,而这个单元测试就是获取数据库中的所有“客户信息”。
     
          注意,其中customerRepository为IRepository<Customer>类型,其最终绑定的类型就是上面所定义NHibernateRepository(通过IOC绑定实现)。
          相信Suteki.Shop会在将来完善这方面的代码,最终给用户提供至少两种数据访问方案:
          一种是Linq To Sql,一种是 NHibernate
     

本文转自 daizhenjun 51CTO博客,原文链接:http://blog.51cto.com/daizhj/163781,如需转载请自行联系原作者
相关文章
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
318 26
|
开发框架 安全 .NET
【Azure Developer】.NET Aspire 项目本地调试遇 Grpc.Core.RpcException 异常( Error starting gRPC call ... )
Error starting gRPC call. HttpRequestException: The SSL connection could not be established, see inner exception. AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
453 12
|
传感器 人工智能 机器人
D1net阅闻|OpenAI机器人项目招新 或自研传感器
D1net阅闻|OpenAI机器人项目招新 或自研传感器
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
481 3
|
开发框架 前端开发 API
C#/.NET/.NET Core优秀项目和框架2024年9月简报
C#/.NET/.NET Core优秀项目和框架2024年9月简报
386 1
|
开发框架 .NET C#
VSCode开发.net项目时调试无效
【9月更文挑战第22天】在使用 VSCode 开发 .NET 项目时遇到调试问题,可从项目配置、调试配置、调试器安装、运行环境、日志和错误信息等方面排查。确认项目类型及文件配置,检查 `launch.json` 文件及配置项,确保调试器扩展已安装并启用,验证 .NET 运行时版本和环境变量,查看 VSCode 输出窗口和项目日志文件,检查权限及代码错误。若问题仍未解决,可查阅官方文档或社区论坛。
883 5
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?
472 0
|
边缘计算 开发框架 人工智能
C#/.NET/.NET Core优秀项目和框架2024年8月简报
C#/.NET/.NET Core优秀项目和框架2024年8月简报
331 0
|
Cloud Native API C#
.NET云原生应用实践(一):从搭建项目框架结构开始
.NET云原生应用实践(一):从搭建项目框架结构开始
下一篇
开通oss服务