1. 程式人生 > >GraphQL教程(一)。.net Core API2.1

GraphQL教程(一)。.net Core API2.1

1.建立專案
2.對類庫操作,在這裡建立三個資料夾,其中一個資料夾改名為schema
3.建立IMovieService,IActorService介面與實現類

GraphQL是什麼將放到第二章來講,第一章為GraphQL的準備工程

1.建立專案

在這裡插入圖片描述

之後選擇空專案,.net core 2.1
在這裡插入圖片描述

新增類庫,取名
在這裡插入圖片描述

2.對類庫操作,在這裡建立三個資料夾,其中一個資料夾改名為schema

在這裡插入圖片描述
Movie:用於確定movie類與actor類得型別
Schema:
Service:用來寫服務的

安裝GraphQL包,加入類庫中
在這裡插入圖片描述

在Movies資料夾中建立Movie類,Actor類與列舉MovieRating,MovieRating為Movie中其中一個的列舉
Movie

using GraphStudy.Movies.Movies;
using System;

namespace GraphStudy.Movie.Movies
{
    //電影類
    public class Movie
    {
        public int Id { get; set; }//電影編號
        public string Name { get; set; }
        public DateTime ReleaseDate { get; set; }//上映時間
        public string Company { get; set; }
        public int ActorId { get; set; }//演員ID
        public MovieRating MovieRating { get; set; }//電影等級列舉
    }
}

列舉MovieRating

using System;

namespace GraphStudy.Movies.Movies
{
    [Flags]
    public enum MovieRating
    {
        //這是電影的5個等級
        Unrated = 0,
        G = 1,
        PG = 2,
        PG13 = 3,
        R = 4,
        NC17 = 5
    }
}

Actor演員類,寫簡單點

namespace GraphStudy.Movies.Movies
{
    //演員類
    public class Actor
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

**

3.建立IMovieService,IActorService介面與實現類

**
在Services資料夾新增IMovieService,IActorService介面與MovieService,ActorServices實現類

IMovieService介面

using GraphStudy.Movies.Movies;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace GraphStudy.Movies.Services
{
    public interface IMovieService
    {
        Task<IEnumerable<Movie>> GetAsyncs();//獲取所有列
        Task<Movie> GetByIdAsync(int id);//獲取某個對應id屬性的列
        Task<Movie> CreateAsync(Movie movie);//建立
    }
}

IActorService介面

using GraphStudy.Movies.Movies;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace GraphStudy.Movies.Services
{
    public interface IActorService
    {
        Task<Actor> GetByIdAsync(int id);//獲取某個演員資訊
        Task<IEnumerable<Actor>> GetAsync();//獲取所有演員資訊
    }
}

IMovieService介面的實現類MovieService類

using GraphStudy.Movies.Movies;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace GraphStudy.Movies.Services
{
    public class MovieService : IMovieService
    {
        //因為我們需要建立子列表,所以一要用到IList
        private readonly IList<Movie> _movie;

        public MovieService()
        {
            _movie=new List<Movie>
            {
                #region 電影列表
    
                new Movie
                {
                    Id = 1,
                    Name = "肖申克的救贖The Shawshank Redemption",
                    Company = "美國",
                    MovieRating = MovieRating.G,
                    ActorId = 1,
                    ReleaseDate = new DateTime(1994-10-14)
                },
                new Movie
                {
                    Id = 2,
                    Name = "這個殺手不太冷 Léon ",
                    Company = "法國",
                    MovieRating = MovieRating.NC17,
                    ActorId = 2,
                    ReleaseDate = new DateTime(1994-09-14)
                },
                new Movie
                {
                    Id = 3,
                    Name = "三傻大鬧好萊塢",
                    Company = "印度",
                    MovieRating = MovieRating.PG,
                    ActorId = 3,
                    ReleaseDate = new DateTime(2011-12-08)
                },
                new Movie
                {
                    Id = 4,
                    Name = "功夫",
                    Company = "美國",
                    MovieRating = MovieRating.G,
                    ActorId = 4,
                    ReleaseDate = new DateTime(2004-12-23)
                }
                #endregion
            };
        }


        public Task<Movie> CreateAsync(Movie movie)
        {
            _movie.Add(movie);
            return Task.FromResult(movie);
        }

        public Task<IEnumerable<Movie>> GetAsyncs()
        {
            return Task.FromResult(_movie.AsEnumerable());
        }

        public Task<Movie> GetByIdAsync(int id)
        {
            //在這裡需要做個判斷這個id是否存在
            var movie = _movie.SingleOrDefault(x => x.Id == id);
            if (movie == null)
            {
                throw new ArgumentException(String.Format("Movie ID {0} 不正確", id););
            }

            return Task.FromResult(movie);
        }
    }
}

IActorService介面的實現,ActorService類

using GraphStudy.Movies.Movies;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace GraphStudy.Movies.Services
{
    public class ActorService : IActorService
    {
        private readonly IList<Actor> _actor;

        public ActorService()
        {
            _actor=new List<Actor>
            {
                #region 演員列表

                new Actor
                {
                    Id = 1,
                    Name = "肖申克"
                },
                new Actor
                {
                    Id=2,
                    Name = "讓·雷諾"
                },
                new Actor
                {
                    Id = 3,
                    Name = "阿米爾·汗,卡琳娜·卡普爾 ",
                },
                new Actor
                {
                    Id=4,
                    Name = "周星馳,元秋 元華"
                }
                #endregion
            };
        }

        public Task<IEnumerable<Actor>> GetAsync()
        {
            return Task.FromResult(_actor.AsEnumerable());
        }

        public Task<Actor> GetByIdAsync(int id)
        {
            var actor = _actor.SingleOrDefault(x => x.Id == id);
            if (actor == null)
            {
                throw new ArgumentException(String.Format("Actor ID {0} 不存在",id));
            }

            return Task.FromResult(actor);
        }
    }
}

此處注意:Movie與Actor中的ID為一對一,所以ActorService裡面new Actor中的id只可唯一,不可以重複,會出錯

4.在startup註冊服務

新增引用
在這裡插入圖片描述

如果出現以下情況
在這裡插入圖片描述
將類庫的版本降為.net core 2.1
右鍵點選類庫->屬性
在這裡插入圖片描述
如果無效,請把引用類庫取消在引用一次類庫
然後進行服務註冊
在這裡插入圖片描述

這是第一部分