愛流浪的小風

技術隨手寫

使用Asp.Net MVC打造Web Api (3) - 開始動手做Api

| Comments

經過前兩天關於本次系統架構的簡單介紹之後,我們將要開始建立我們的Api系統,今天主要的內容將會向大家簡單介紹Api的各個Layer大概會如何規劃,以及程式碼架構會長什麼樣子,並且簡單的實現我們第一個Api。

今天的所有程式碼的細節可以直接從Github上Get下來看喔!

ApiSample - Tag Day01

系統架構 - N Tier

為了讓程式碼更加容易擴充,並且增加可重複使用性,Api的主要系統架構採用N-Tier架構設計,而各Layer再依據不同的功能或是角色加以細分,以因應未來系統擴充或是提供給其它內部網站使用的可行性。

系統大致上可以概括為以下五個Layer

  1. Presentation Layer - 為提供給使用者接觸的介面,這邊為Api的WebSite
  2. Business Logic Layer - 包含資料轉換、資料驗證或商業邏輯等相關功能
  3. Data Access Layer - 包含從資料庫存取資料,提供給前端呈是使用
  4. Model Layer - 系統使用的物件資料定義
  5. Cross Cutting Layer - 包含Log、Error Handle等各層都可能會使用的共用元件

Solution檔案結構

在準備建立的Solution資料夾下,建立屬於各Layer的資料夾,並且建立各Layer所擁有的專案

粉紅色為Layer資料夾,灰色為專案

建立完各Layer的資料夾,並且在各Layer的資料夾建立完專案之後,我們的Solution結構長的會像這樣

註: 網站部分使用Asp.Net MVC 4.0

專案相依性

我們按照之前N Tier的關係圖,建立專案之間的參考,建立完成之後,透過Visual Studio的功能可以產生各專案之間的相依性圖形如下

建立第一個Api

目標: 我們希望可以建立一個Api,使用者可以透過/Sample/Index,使用Get來取得Sample資料的清單

  1. 首先我們在ApiSample.Models專案,建立一個資料模型SampleModel.cs

    public class SampleModel
    {
        public int Id { get; set; }    
    
        public string Data { get; set; }    
    
        public DateTime CreatedAt { get; set; }
    }
    
  2. 接下來在ApiSample.DA.Interfaces專案建立Repository的介面ISampleRepository.cs

    public interface ISampleRepository
    {
        IEnumerable<SampleModel> GetSamples();
    }
    
  3. 並在ApiSample.DA.Repository實現取得資料的部分SampleRepository.cs,這邊暫時使用假資料

    public class SampleRepository : ISampleRepository
    {
        public IEnumerable<SampleModel> GetSamples()
        {
            for (int i = 0; i < 10; i++)
            {
                yield return new SampleModel()
                {
                    Id = i,
                    Data = string.Format("Data - {0}", i),
                    CreatedAt = DateTime.Now
                };
              }
          }
      }
    
  4. 實現BL層的介面與實作

    public interface ISampleService
    {
          IEnumerable<SampleModel> GetSamples();
    }
    
    public class SampleService : ISampleService
    {
        public ISampleRepository SampleRepository { get; set; }
    
          //// 尚未套用Ioc,暫時直接初始化
        public SampleService()
            : this(new SampleRepository())
          {
        }
    
        public SampleService(ISampleRepository sampleRepository)
        {
              this.SampleRepository = sampleRepository;
        }
    
        public IEnumerable<SampleModel> GetSamples()
        {
              return this.SampleRepository.GetSamples();
        }
    }      
    
  5. 在網站實現SampleController,在Index方法提供Sample資料清單

    public class SampleController : Controller
    {
        public ISampleService SampleService { get; set; }
    
              //// 尚未套用Ioc,暫時直接初始化
          public SampleController()
              :this(new SampleService())
          {
          }
    
          public SampleController(ISampleService sampleService)
          {
              this.SampleService = sampleService;
          }
    
          public ActionResult Index()
          {
              var data = this.SampleService.GetSamples();
    
              return Json(data, JsonRequestBehavior.AllowGet);
          }
      }
    
  6. 修改RouteConfig,讓起始畫面導至/Sample/Index

    public class RouteConfig
      {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                name: "Default",
                  url: "{controller}/{action}/{id}",
                  defaults: new { controller = "Sample", action = "Index", id = UrlParameter.Optional }
              );
          }
      }
    
  7. 按下F5執行網站,可以看到執行結果,得到Api的Json格式資料

本日小結

在今天的介紹中,我們完成了第一個Api,也同時將我們的系統初步的架構了起來,接下來我們也將以此為基礎繼續實現我們Api所需要的各種功能,關於今天的內容歡迎大家一起討論^_^

Comments

comments powered by Disqus