代码改变世界

【翻译】How-To: Using the N* stack, part 1

2009-09-28 09:25  LeoXing  阅读(2020)  评论(0编辑  收藏  举报
原文作者:Jason
原文地址:http://jasondentler.com/blog/2009/08/how-to-using-the-n-stack-part-1/

注:这是我第一次翻译文章,而且英文水平一般,如果大家发现那里有错误,请及时和我联系,谢谢。

这是一个关于NHibernate的系列文章,将带你一步步的从你的第一个ASP.NET MVC网站到一个登记社区学院学生工作的Web应用程序。更重要的是,您可以轻松的将这个项目转换成你自己的项目模板来使用。

首先在第一次教程里,将带领大家设置你的 Visual Studio 解决方案。

在这系列文章中,我们将使用的工具如下:
  • ASP.NET MVC 是一项完全免费的并且由 Microsoft 提供支持的产品,和 ASP.NET WebForms 不同,它可以使你完全控制你的应用程序。 你可以使用 Web Platform的安装程序,或者直接下载 MSI 安装程序包。
  • MVCContrib 这是为 ASP.NET MVC 添加的附加功能,使 ASP.NET MVC 更易于使用。
  • jQuery 这是一个开放源代码的 javascript 类库,并支持任何浏览器。 如果你不喜欢 javascript,我保证你会爱上jQuery的。
  • NHibernate 2.1 是一款著名、成熟并且开放源代码的对象关系映射(ORM)工具。它可以帮助你快速的完成你之前可能需要几天、几个星期、甚至几个月的数据访问层的应用。
  • Fluent NHibernate 可以让你用编程的方式进行配置Nhibernate的映射文件,彻底摆脱手写NHibernate映射文件的烦恼。
  • Ninject 是我个人最喜欢的依赖注射(DI)/控制反转(IoC)框架。它允许你自动绑定服务到你的对象。如果你之前从未使用过IoC容器的话,它将给你带来一个惊喜。

你还需要:

  • .NET Framework 3.5 SP1
  • Visual Studio 2008 SP1
  • 最新版本的 NUnit
  • NHibenate 所支持的数据库,例如 Oracle 、SQL Server 、 SQLite,MySQL 数据库。 本示例将使用 SQL Server。

OK,准备好了所有需要的软件,下面介绍一些术语的基本概念:

  • MVC 是指 Model-View-Controller。这种责任分离的设计可以更灵活地适应和改变你的应用程序。
  • Model(模型) – 这个是指实体类,也就是业务对象。例如在一个账务软件中,Model 就是指发票、发票项目、客户、产品等所有真实世界里的对象。
  • View(视图) – View 就是以一种特定的方式来呈现一个特定的业务对象。例如你可能需要一个编辑客户信息的 View,另一个用来显示发票信息。你也可以认为 View 就是你应用程序中的一个页面。
  • Controller(控制器) – Controller 就是我们获取数据,然后将数据绑定到页面控件的这个业务流程。
  • Inversion of Control (IoC)(控制反转) – 的概念是不需要对象自己去控制关联依赖关系,而是将这些工作交给系统去处理,使用面向接口编程,减少各个层之间的耦合。这种松耦合的设计可是让你轻松的代替服务的实现,而无需关注每个实现它们的类。我知道的两种主要类型的 IoC: 服务定位器( Service Locator )和依赖注入( Dependency Injection )。
  • Service Locator (服务定位器) –  一个服务定位器是一个中央容器,它知道如何控制应用程序中需要的所有服务,对象将从服务定位器中获取每个服务的实现。一个服务定位器通常都是单例的,这就是为什么我不喜欢它。
  • Dependency Injection (DI)(依赖注入)– 是连接服务对象的方法。指程序运行的过程当中,如果需要调用另一个对象的时候,无须在代码中创建被调用的对象,对象本身是由依赖注入框架创建的,在本系列中我们使用 Ninject 。在 Ninject Dojo 里有非常好的依赖注入教程,是开始学习 IoC 非常好的地方。

设置解决方案

该项目的设置是非常简单的,基本上所有操作都是通过Visual Studio完成。请按照下列步骤完成。
  1. 1.创建解决方案和项目

     在 Visual Studio 中, 创建一个新的 ASP.NET MVC Web 应用程序。 我们把它的名字改为 NStackExample 。 

     在这里还需要注意几件事。首先,我们需要创建一个解决方案目录。其次,请注意项目的名称后面包含 .Web ,和方案名称不是相同的。

     该Web项目将包含全部 View 层的页面。尽管我们是通过 ASP.NET MVC 模板建立的,但是这里并不会包括 Model 和 Controller。

  2. 2.创建类库目录

     在你的解决方案目录中创建一个项目中所用到的所有第三方类库的目录。例如在这里我们创建一个 Solution items 目录,并将下列15个程序集复制过去。

    • MVCContrib:
      • MVCContrib.dll
      • Microsoft.Web.Mvc.dll
      • System.Web.Abstractions.dll
      • System.Web.Mvc.dll
      • System.Web.Routing.dll
    • NHibernate:
      • Antlr3.Runtime.dll
      • Iesi.Collections.dll
      • log4net.dll
      • NHibernate.dll
      • Castle.Core.dll
      • Castle.DynamicProxy2.dll
      • NHibernate.Bytecode.Castle.dll
    • FluentNHibernate.dll from Fluent NHibernate
    • Ninject:
      • Ninject.Core.Dll
      • Ninject.Framework.Mvc.Dll
  3. 3.创建Core项目

     这个是最主要的项目,它包括解决方案中所需要的所有接口和模型,同时需要注意 Core 项目中不会包含任何实现部分,实现部分应该放在单独的,容易替换的程序集中。

     在解决方案中添加一个新的类库项目,并将名字改为 NStackExample.Core 。

     创建完成之后右键点击该项目并选择属性,选择应用程序(Application)选项卡,在根命名空间中删除 .Core 。

     

  4. 4.创建 Controller 项目

     接下来创建 MVC 中所需要的 Controller 类库,我们叫它 NStackExample.Controllers 。虽然在微软自带的模板中已经存在了这个文件夹,不过我们不会使用该文件夹,因为我认为我们最好应该将 Controller 从网站中分离出来。

  5. 5.清理项目

     将下列内容删除掉:

    • 在 Core 和 Controllers 项目中删除 Class.vb 或 Class.cs 文件。
    • 在 NStackExample.Web 项目中:
      • Controllers 目录和目录下的所有内容
      • Models 目录
      • Scripts 目录下的 Microsoft AJAX 脚本库
      • Views 目录下的 Home 和 Account 目录
      • Views 目录下的 LogOnUserControl

  6. 6.设置项目引用

     将下列内容删除掉:

    1. 首先在 Web 项目中, 删除对 System.Web.Abstractions, System.Web.Mvc 和 System.Web.Routing 的引用 
    2. 接下来,在 Web 项目中添加我们第二步创建的文件夹里的10个程序集:
      • log4net.dll
      • Microsoft.Web.Mvc.dll
      • MvcContrib.dll
      • NHibernat.Bytecode.Castle.dll
      • NHibernate.dll
      • Ninject.Core.dll
      • Ninject.Framework.Mvc.dll
      • System.Web.Abstractions.dll
      • System.Web.Mvc.dll
      • System.Web.Routing.dll
    3. 在 Web 项目中添加对 Core 和 Controller 的引用
    4. 在 Controllers 项目中添加对以下3个程序集的引用:
      • log4net.dll
      • MvcContrib.dll
      • System.Web.Mvc.dll
    5. 在 Controllers 项目中添加对 Core 项目的引用

大家有没有注意到我们并没有在 Core 项目中添加任何引用? 这是特意的。当一个项目需要引用模型或服务的接口时,你不会希望它还需要依赖其他的类库或程序集。

到这里,我们的解决方案已经创建完毕,你已经可以开始编码了。在接下来的教程中,我们将开始生成实体类,配置 NHibernate 和建立数据库。