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,如需转载请自行联系原作者
相关文章
|
9天前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
12天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
10天前
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
|
18天前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
1月前
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
36 1
Spring MVC——项目创建和建立请求连接
|
1月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
40 2
|
1月前
|
开发框架 前端开发 API
C#/.NET/.NET Core优秀项目和框架2024年9月简报
C#/.NET/.NET Core优秀项目和框架2024年9月简报
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
57 2
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控件,该如何解决?
|
1月前
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?

热门文章

最新文章