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,如需转载请自行联系原作者
相关文章
|
7天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
20 7
|
17天前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
33 8
|
17天前
|
架构师 开发者
【悬念揭秘】DDD:那片隐藏在软件深处的业务乐土——.NET项目如何借力领域驱动设计,让复杂业务逻辑迎刃而解?
【8月更文挑战第28天】领域驱动设计(DDD)在.NET项目中的应用聚焦于将业务领域知识与软件开发紧密结合,通过构建清晰的领域模型管理复杂业务逻辑。DDD的核心概念包括限界上下文、聚合、实体等,确保模型与实现的统一。在.NET中,通过CQRS和事件源等模式提高系统响应性和可扩展性,实现业务事件驱动的解耦与协作。DDD不仅是一种设计方法,更是要求开发者深入理解业务的文化,助力.NET项目应对复杂挑战,实现业务与技术的融合。
41 6
|
17天前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
31 5
|
17天前
|
Kubernetes 监控 Devops
【独家揭秘】.NET项目中的DevOps实践:从代码提交到生产部署,你不知道的那些事!
【8月更文挑战第28天】.NET 项目中的 DevOps 实践贯穿代码提交到生产部署全流程,涵盖健壮的源代码管理、GitFlow 工作流、持续集成与部署、容器化及监控日志记录。通过 Git、CI/CD 工具、Kubernetes 及日志框架的最佳实践应用,显著提升软件开发效率与质量。本文通过具体示例,助力开发者构建高效可靠的 DevOps 流程,确保项目成功交付。
41 0
|
5天前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
16 0
|
7天前
|
JSON 测试技术 C#
C#/.NET/.NET Core优秀项目框架推荐榜单
C#/.NET/.NET Core优秀项目框架推荐榜单
|
14天前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
52 0
|
14天前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
33 0
|
20天前
|
C# C++
【Azure Function】在VS Code中创建Function项目遇见 No .NET worker runtimes found
【Azure Function】在VS Code中创建Function项目遇见 No .NET worker runtimes found