使用MVC4,Ninject,EF,Moq,構建一個真實的應用電子商務SportsStore(一)


如果你已經准備好了開始MVC4的遠航,那我們就閑話少說,背起行裝,踏上征途吧!
 
完成SportsStore電子商務平台,你將學會:
1.使用MVC4開發你的應用項目.
2.使用Ninject完成IOC注入.
3.使用Entity Framework 操作Sql server 數據庫.
4.使用Moq測試你的項目。
 
好了,現在請啟動你的VS2012吧!
 
我們首先要創建的是一個空的Visual Studio solution。在這個solution中,我們將創建3個工程。
1. 一個域模塊工程。
2.一個MVC4應用。
3.一個單元測試工程。
 
現在我們就創建一個名為SportsStore的空solution,它看起來像下面的截圖:
 
 

工程名

VS工程模板

目的

SportsStore.Domain

Class Library

域Entities和logic;

使用Entity Framework 創建一個repository,並將其設置為一個持久層。

SportsStore.WebUI

ASP.NET MVC 4 Web Application

controllers and views

SportsStore.UnitTests

Unit Test Project

unit tests

 
你可以刪除SportsStore.Domain工程中的class1.cs,我們不會使用它。
在SportsStore.Domain建兩個文件夾Abstract,Entities. 在SportsStore.WebUI中建一個文件夾Infrastructure. 如下圖:
 
 
 
到這一步我們的項目框架的雛形已經出來了,現在我們要為它添加引用。在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
 
設置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;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;
using Moq;
using Ninject;
using SportsStore.Domain.Concrete;

namespace SportsStore.WebUI.Infrastructure
{
    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 class 去創建Controller對象,要實現這一點,請打開SportsStore.WebUI工程的Global.asax.cs 文件,添加代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using SportsStore.WebUI.Infrastructure;

namespace SportsStore.WebUI
{
    // 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
    // 請訪問 http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //Added by wangzhiyue 
            //We need to tell MVC that we want to use the NinjectController 
            //class to create controller objects
            ControllerBuilder.Current.SetControllerFactory(new
                         NinjectControllerFactory());
            //Added end

            AuthConfig.RegisterAuth();
        }
    }
}

啟動域模塊

 
現在我們將要啟動域模塊,在MVC應用中應用領域模型,能使每一件事情都變得完美,因此,域 也就必然 是啟動應用的最完美的地方。因為我們要做的電子商務應用,所以,我們需要一個產品,這是在明顯不過的事了。右擊我們剛剛建立的Entities文件夾,然后新建一個C#類,命名為Product ,代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SportsStore.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; }
    }
}
 
注意這個public關鍵字,因為我們將域模型分離為獨立的工程,所以將訪問關鍵字定義為public,你可以不
這么做,但這樣做有助於模塊的分離,使項目層次鮮明、簡潔。
 
 如果你覺得從我的文章中學到了知識,那么請繼續關注我續篇!
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM