---
# System prepended metadata

title: ASP .NET MVC Study Note
tags: [NTUST-CC]

---

# ASP .NET MVC Study Note
###### tags: `NTUST-CC`
### 介紹
什麼是MVC?，MVC是一種”設計模式”，不是程式語言也不是一種框架。把應用程式架構區分為三個部分，分別為Model(模型)、View(視圖)和Controller(控制器)。

符合MVC架構的狀態下，1.外部發出一個request請求後，2.routing指定適當的路徑，接著進到controller，3.controller作為views和model的協調處理者，必須給予對方回應。4.控制器調用view，5.在瀏覽器中呈現視圖。model指的是應用邏輯層，負責應用的邏輯運算與方法操作。

整個專案的分層式架構，主要是資料顯示層 -> 資料連接層(商業邏輯) -> 服務層 -> 資料庫層
![](https://i.imgur.com/ND6IRhJ.png)


#### View
在頁面上顯示或是經由頁面傳回後端都是View所負責，View的呈現分為輸出和輸入，輸出：把資料輸出並顯示到使用者介面上，輸入：把使用者所輸入的資料傳回到伺服器端。
![](https://i.imgur.com/qYBDMXq.png)

#### Controller
Controller 主要是負責回應對 ASP .NET MVC 網站提出的要求。

### 範例
這邊test為這次的範例，原則上一個.cshtml只會對應到一個Controller。
1. View Layer
這邊假設我要做一個填寫姓名的表單，會希望可以在DB上去新增、刪除及搜尋做一些API操作。
2. Model.cs
剛提到要依填寫姓名的表單，就需要姓名`Name`跟英文姓名`NameEn`的參數。
```javascript=
namespace HRVote.Domain
{
    public class test
    {
        public string Name { get; set; }
        public string NameEn { get; set; }

    }
}
```
3. Controller
此為testController的程式碼，在上方紅框來說屬於結構化流程。
Controller下有Service層。Service 是很常見的設計模式，通常會把商業邏輯寫在 Service 層，才不會讓 Controller 過於笨重。
![](https://i.imgur.com/RqZ9Fn3.png)
4. Service Layer
剛剛提到一般直接的寫法是Controller底下寫商業邏輯，以下面的服務(商業邏輯)來說，我要在前面定義的名字參數上做新增、修改、刪除和搜尋名稱的動作。
但假設我別的API也要使用同樣的服務，這樣只能將複製貼上到另一個Controller裡面。
![](https://i.imgur.com/Oa7kbou.png)

因此為了方便維護系統，將Service從Controller分離出來形成自己Layer
![](https://i.imgur.com/KwWy23w.png)

**testService.cs**
```javascript=
using AutoMapper;
using HRVote.Domain;
using HRVote.Repository.Interface;
using HRVote.Service.Interface;
using System.Collections.Generic;
using System.Linq;

namespace HRVote.Service
{
    public class testService : ItestService
    {
        private readonly ItestRepository testRepository;
        private readonly IMapper mapper;
        public testService(ItestRepository testRepository, IMapper mapper)
        {
            this.testRepository = testRepository;
            this.mapper = mapper;
        }

        public void Add(string index)
        {
            throw new System.NotImplementedException();
        }

        public void Delete(string index)
        {
            throw new System.NotImplementedException();
        }

        public string GetSutdentInfo(string studentid)
        {
            var reslut = testRepository.Where(item=>item.Name== studentid).FirstOrDefault();
            var aa = testRepository.Where(item=>item.NameEn== studentid).FirstOrDefault();
            var customersResponse = mapper.Map<StudentInfo>(aa);
            return reslut.NameEn;
        }

        public void Put(string index)
        {
            throw new System.NotImplementedException();
        }

        public List<test> Search(string index)
        {
            throw new System.NotImplementedException();
        }
    }
}

```
5. Repository Layer

在Controller直接去使用ApplicationDbContext對資料庫進行處理不是好的做法，所以要把這種方式做改變，不要直接在Controller中直接對ApplicationDbContext進行資料操作，這裡有一個重要的觀念是”關注點分離(SOC)”。以下對”關注點分離”稍微解釋一下，資料操作就是一種關注點，而資料驗證、流程控制都是關注點，當把這些關注點都放在一起的話，會覺得很混亂，所以我們可以把對資料庫做操作的部分給抽離出來，這就叫做”關注點分離”。 

把資料庫抽離出來，通常會使用一種設計模式”Repository Pattern”，而這個模式就是用來處理資料操作，資料操作基本上一定有”CRUD”也就是Create(建立)、Read(讀取)、Update(更新)和Delete(刪除)，所以我們就去為每個Model類別建立專屬的Repository類別，每個Repository類別只專注於自己所負責的Model的資料操作，不會干涉到其他資料類別的操作。 建立Repository還有一個優點是可重複使用，像是取得某筆資料、取得全部資料，這些資料操作會經常重複使用，可以將這些重複性高的方法建立在Repository，所以如果取得的資料有變動的話，就只需要修改Repository的方法就可以了。 
![](https://i.imgur.com/ZEq1Hfk.png)

