《精通ASP.NET MVC5》第7章 SportStore:一个真正的应用程序

Posted 【唐】三三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《精通ASP.NET MVC5》第7章 SportStore:一个真正的应用程序相关的知识,希望对你有一定的参考价值。

7.1 开始

7.1.1 解决方案

我们首先要创建的是一个空的Visual Studio solution。在这个 solution 中,我们将创建3个工程。

1. 一个域模块工程。

2.一个MVC4应用。

3.一个单元测试工程。

       

现在我们就创建一个名为 SportsStore 的空 solution ,

工程名

VS工程模板

目的

SportsStore.Domain

Class Library

使用Entity Framework 创建一个repository,并将其设置为一个持久层。

SportsStore.WebUI

ASP.NET MVC Web Application

controllers and views

SportsStore.UnitTests

Unit Test Project

unit tests

       

       

       

7.1.2 安装工具包

Install-Package Ninject -version 3.0.1.10

Install-Package Ninject.Web.Common -version 3.0.0.7

Install-Package Ninject.MVC3 -Version 3.0.0.6

Install-Package Moq -version 4.1.1309.1617

Install-Package Microsoft.Aspnet.Mvc -version 5.0.0

       

       

7.1.3 项目之间的引用

到这一步我们的项目框架的雏形已经出来了,现在我们要为它添加引用。在solusion管理器中,一次右击

每个工程,选择Add Reference

       

工程名

工具依赖

工程依赖

微软引用

SportsStore.Domain

Entity Framework

None

System.Web.Mvc

System.ComponentModel.DataAnnotations

SportsStore.WebUI

Ninject

Moq

SportsStore.Domain

    

None

SportsStore.UnitTests

Ninject

Moq

SportsStore.Domain

SportsStore.WebUI

System.Web.Mvc

System.Web

Microsoft.CSharp

       

注意: System.Web.Mvc 的版本一定选择4.0.0

       

7.1.4 设置DI Container

       

在我们这个应用中,对MVC框架做了很多扩展,这也是我们学习的重点内容,掌握了这些知识点,

我们再以后的开发项目中,就能得心应手,构建出稳定的,易于扩展和维护的企业应用架构。

右击 SportsStore.WebUI 工程的 Infrastructure 文件夹,选择添加类,类名为 NinjectControllerFactory

       

using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Web;  

using System.Web.Mvc;  

using System.Web.Routing;  

        

namespace SportStore.WebUI.Infrastructure  

{  

   /// <summary>  

    /// 工厂类  

   /// </summary>  

    public class NinjectControllerFactory : DefaultControllerFactory  

    {  

        private IKernel ninjectKernel;  

        

        public NinjectControllerFactory()  

        {  

            ninjectKernel = new StandardKernel();  

            AddBindings();  

        }  

        

        protected override IController GetControllerInstance(RequestContext  

            requestContext, Type controllerType)  

        {  

            return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);  

        }  

        

        private void AddBindings()  

        {  

            //put bindings here  

        }  

    }  

}  

我们现在还没有添加任何绑定,但是,当我们需要时,能使用 AddBindings 方法去添加. 现在,我们需要去

告诉 MVC 我们打算使用 NinjectController 类去创建Controller对象,要实现这一点,请打开SportsStore.WebUI工程的 Global.asax.cs 文件

       

public class Global : System.Web.HttpApplication  

{  

        

    protected void Application_Start(object sender, EventArgs e)  

    {  

        AreaRegistration.RegisterAllAreas();  

        RouteConfig.RegisterRoutes(RouteTable.Routes);  

        

        //我们需要告诉我们想要使用 Ninject Controller MVC  

        //类来创建控制器对象  

        ControllerBuilder.Current.SetControllerFactory(new  

                    NinjectControllerFactory());  

    }  

}  

       

7.2 启动域模块

现在我们将要启动域模块,在MVC应用中应用领域模型,能使每一件事情都变得完美,因此,域 也就必然 是启动应用的最完美的地方。因为我们要做的电子商务应用,所以,我们需要一个产品,这是在明显不过的事了。右击我们刚刚建立的 Entities 文件夹,然后新建一个C#类,命名为 Product 

namespace SportStore.Domain.Entities  

{  

    public class Product  

    {  

        public int ProductID { get; set; }  

        public string Name { get; set; }  

        public string Description { get; set; }  

        public decimal Price { get; set; }  

        public string Category { get; set; }  

    }  

}  

       

7.2.1 创建抽象存储库

       

我们知道,我们需要一些途径或方式,去数据库中取得Product entities。为了保持架构上的完美,我们要遵循持久逻辑与域模型实体分离的原则,要做到这一点,我们使用repository 设计模式. 我们不需要担心怎样去实现持久层,我们从定义一个接口开始,去启动它。

       

Abstract 文件夹上右击,选择添加一个接口,命名为 IProductsRepository

namespace SportStore.Domain.Abstract  

{  

    public interface IProductRepository  

    {  

        IEnumerable<Product> Products { get; }  

    }  

}  

       

口使用了 IEnumerable<T> 接口去获取一个Product对象,我们没有告诉它去哪或怎么样去取得数据,一个使用 IProductsRepository 接口的类能够取得Product 对象,而不需要知道它们从哪来或被谁传递,这就是 repository设计模式的本质。接下来我们就通过添加一些特性到我们代码中,去再次拜访一下这个接口。

     

7.2.2 创建模仿存储库

构建一个Mock Repository

现在我们已经定义了一个 abstract interface, 我们能够实现这个持久化机制并且挂接到数据库,不过这是不是现在要做的,为了能够启动这个项目的其他部分,现在我们要创建一个 IProductsRepository 接口的 Mock 实现,我们需要在我们的 SportsStore.WebUI 工程的 NinjectControllerFactory 类的 AddBindings 方法中去做这件事。

       

using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Web;  

using System.Web.Mvc;  

using System.Web.Routing;  

using Moq;  

using Ninject;  

using SportStore.Domain.Abstract;  

using SportStore.Domain.Entities;  

        

namespace SportStore.WebUI.Infrastructure  

{  

   /// <summary>  

    /// 工厂类  

   /// </summary>  

    public class NinjectControllerFactory : DefaultControllerFactory  

    {  

        private IKernel ninjectKernel;  

        

        public NinjectControllerFactory()  

        {  

            ninjectKernel =Microsoft 'Identity Platform' 是不是(轻松)与'(ASP.NET) Identity Framework' - MVC5 & .NET 4.7.2 集成?

《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第二节:MVC5项目结构

.NET开发——MVC5之数据传递应用

ASP.NET + MVC5 入门完整教程三 (上) ---第一个MVC项目

如何确保使用 ASP.NET MVC5 和 IIS 7.5 express 刷新 CSS 文件

ASP.NET MVC5 在用户注册时自动填充第二个表

(c)2006-2024 SYSTEM All Rights Reserved IT常识