ASP. NET 5 시리즈 튜 토리 얼 (7) 완결 편 - 판독 코드

13941 단어 asp.net5
본 논문 에서 우 리 는 TodoController 류 코드 를 함께 볼 것 이다.
[Route] 속성 은 Controller 의 URL 템 플 릿 을 정의 합 니 다.
[Route("")]

 
이 템 플 릿 형식 에 맞 는 모든 HTTP 요청 은 이 controller 로 연 결 됩 니 다.이 예 에서 경로 의 이름 은 Controller 에 대응 하 는 접두사 이 고 TodoController 류 에 대해 서 는 템 플 릿 이 'api / todo' 입 니 다.
HTTP 방법
[HttpGet], [HttpPost] 와 [HttpDelete] 속성 을 controller 동작 에 대응 하 는 HTTP 방법 으로 정의 합 니 다 (또한 [HttpPut] 와 [HttpPatch] 속성 도 있 으 며, 이 예제 에 서 는 사용 되 지 않 았 습 니 다.)
[HttpGet]
 IEnumerable<TodoItem> GetAll() {}
 
 
[HttpGet("", Name = "")]
 IActionResult GetById (int id) {}
 
 
[HttpPost]
 void CreateTodoItem([FromBody] TodoItem item) {}
 
 
[HttpDelete("")]
 IActionResult DeleteItem(int id) {}

 
GetById 와 DeleteItem 방법의 매개 변 수 는 루트 의 전달 정 보 를 증가 시 킬 수 있다.따라서 루트 템 플 릿 의 보다 완벽 한 문법 은 'api / [controller] / {id: int}' 입 니 다.
"{id: int}" 에서 id 는 변수 이 고 "int" 는 매개 변 수 를 정형 으로 합 니 다.다음은 URL 인 스 턴 스 입 니 다.
http://localhost/api/todo/1
http://localhost/api/todo/42

다음 으로 쓸 수 없습니다:
http://localhost/api/todo/abc

 
GetById 와 DeleteItem 방법 역시 id 라 는 인 자 를 가지 고 있 습 니 다.프레임 워 크 는 컨트롤 러 에 실제 값 을 자동 으로 전달 합 니 다.하면, 만약, 만약...http://localhost/api/todo/42, id 의 값 은 42 이 고 이 과정 은 매개 변수 로 연 결 됩 니 다.
Create Todo Item 방법 은 다른 매개 변수 바 인 딩 을 대표 합 니 다:
[HttpPost]
 void CreateTodoItem([FromBody] TodoItem item) {}

 
[FromBody] 속성 지정 framework 는 Request 에서 TodoItem 인 자 를 역 직렬 화 합 니 다.
다음은 request 와 contrller 동작 에 대응 하 는 목록 입 니 다.
Request
Controller Action
GET /api/todo
GetAll
POST /api/todo
CreateTodoItem
GET /api/todo/1
GetById
DELETE /api/todo/1
DeleteItem
GET /api/todo/abc
none – returns 404
PUT /api/todo
none – returns 404
마지막 두 가지 예 는 다른 용도 로 404 오 류 를 되 돌려 줍 니 다.예 를 들 어 'GET / api / todo / abc', 'abc' 실 참 은 GetById 방법 에서 요구 하 는 정형 데이터 형식 이다.
액 션 반환 값
TodoController 류 는 다양한 contrller action 의 반환 값 방법 을 보 여 줍 니 다.
GetAll 방법 은 CLR 대상 을 되 돌려 줍 니 다.
[HttpGet]
 IEnumerable<TodoItem> GetAll()
{
     _items;
}

반환 대상 의 직렬 화 정 보 는 Response 메시지 에 저 장 됩 니 다.기본 형식 은 JSON 이 고 클 라 이언 트 역시 XML 데이터 형식 을 받 을 수 있 습 니 다.
 http://localhost:5000/api/todo HTTP/1.1
 
 
User-Agent: Fiddler
 
 
Host: localhost:5000
 
 
Accept: application/xml

Response:
HTTP/1.1 200 OK
Content-Type: application/xml;charset=utf-8
Server: Microsoft-HTTPAPI/2.0
: Thu, 30 Oct 2014 22:40:10 GMT
Content-Length: 228
 
 
<ArrayOfTodoItem xmlns:i="" xmlns=""><TodoItem><Id>1</Id><IsDone></IsDone><Title>First Item</Title></TodoItem></ArrayOfTodoItem>

 
GetById 방법 은 IAction Result 인 터 페 이 스 를 되 돌려 줍 니 다:
[HttpGet("", Name = "")]
 IActionResult GetById (int id)
{
    var item = _items.FirstOrDefault(x => x.Id == id);
     (item == null)
    {
         HttpNotFound();
    }
 
 
      ObjectResult(item);
}

 
URL 에 대응 하 는 id 가 있 으 면 이 방법 은 Object Result 로 돌아 갑 니 다.Object Result 를 되 돌려 주 는 것 은 CLR 모델 을 되 돌려 주 는 것 과 같 습 니 다.방법 에 서 는 반환 유형 을 IAction Result 로 규정 하고 있다.따라서 이 방법 은 다른 유형 으로 돌아 갈 수 있다.
대응 하 는 ID 가 없 으 면 HttpNotFound 로 돌아 가면 페이지 에 404 오류 가 발생 합 니 다.
마지막 으로 Create Todo Item 방법 은 방법 에 반환 값 을 직접 설정 하 는 방법 을 보 여 줍 니 다.
[HttpPost]
 void CreateTodoItem([FromBody] TodoItem item)
{
    // (some code  shown here)
 
 
    Context.Response.StatusCode = 201;
    Context.Response.Headers[""] = url;
}

 
이런 방법의 결함 은 단원 테스트 를 진행 하기 매우 어렵다.(테스트 관련 토론 은 Unit Testing Controllers in ASP. NET Web API 참조).
의존 주입
MVC 6 에는 의존 주입 기능 이 내장 되 어 있다.ToDo 목록 을 포함 하 는 reposcory 클래스 를 만 듭 니 다.
우선, reposcory 에 인 터 페 이 스 를 정의 합 니 다.
 System.Collections.Generic;
 
 
 TodoApi.Models
{
      ITodoRepository
    {
        IEnumerable<TodoItem> AllItems { ; }
        void Add(TodoItem item);
        TodoItem GetById(int id);
        bool TryDelete(int id);
    }
}

 
이후 구체 적 인 실현 방법 을 정의 한다.
 System;
 System.Collections.Generic;
 System.Linq;
 
 
 TodoApi.Models
{
      TodoRepository : ITodoRepository
    {
         List<TodoItem> _items =  List<TodoItem>();
 
 
         IEnumerable<TodoItem> AllItems
        {
get
            {
                 _items;
            }
        }
 
 
         TodoItem GetById(int id)
        {
             _items.FirstOrDefault(x => x.Id == id);
        }
 
 
         void Add(TodoItem item)
        {
            item.Id = 1 + _items.Max(x => (int?)x.Id) ?? 0;
            _items.Add(item);
        }
 
 
         bool TryDelete(int id)
        {
            var item = GetById(id);
             (item == null)
            {
                 ;
            }
            _items.Remove(item);
             ;
        }
    }
}

 
구조 함 수 를 사용 하여 reposcory 를 contrller 에 주입 합 니 다:
[Route("")]
  TodoController : Controller
{
    // Remove this code:
    //  List<TodoItem> _items =  List<TodoItem>()
    //{
    //     TodoItem { Id = 1, Title = "" }
    //};
 
 
    // Add this code:
      ITodoRepository _repository;
 
 
     TodoController(ITodoRepository repository)
    {
        _repository = repository;
    }

 
그리고 controller 방법 을 reposcory 로 업데이트 합 니 다.
[HttpGet]
 IEnumerable<TodoItem> GetAll()
{
     _repository.AllItems;
}
[HttpGet("", Name = "")]
 IActionResult GetById(int id)
{
    var item = _repository.GetById(id);
     (item == null)
    {
         HttpNotFound();
    }
 
 
      ObjectResult(item);
}
 
 
[HttpPost]
 void CreateTodoItem([FromBody] TodoItem item)
{
     (!ModelState.IsValid)
    {
        Context.Response.StatusCode = 400;
    }
else
    {
        _repository.Add(item);
 
 
         url = Url.RouteUrl("",  { id = item.Id }, Request.Scheme, Request.Host.ToUriComponent());
        Context.Response.StatusCode = 201;
        Context.Response.Headers[""] = url;
    }
}
 
 
[HttpDelete("")]
 IActionResult DeleteItem(int id)
{
     (_repository.TryDelete(id))
    {
          HttpStatusCodeResult(204); // 201 No Content
    }
else
    {
         HttpNotFound();
    }
}

 
우 리 는 주입 시스템 에 의존 할 때 까지 reposcory 를 등록 해 야 작 동 할 수 있 습 니 다.Startup 클래스 에 다음 코드 를 추가 합 니 다.
 void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    //  code
    services.AddSingleton<ITodoRepository, TodoRepository>();
}

 
응용 프로그램 이 실 행 될 때 contrller 가 생 성 되면 framework 는 TodoRepository 를 contrller 에 자동 으로 주입 하여 전체 응용 수명 주기 에 작용 합 니 다.
IIS 외 독립 배치 응용
기본적으로 F5 를 누 르 면 IIS Express 에서 실 행 됩 니 다.도구 모음 에서 IIS Express 아이콘 을 볼 수 있 습 니 다.
clip_image001
 
ASP. NET 5.0 은 다른 서버 에 배치 할 수 있 습 니 다. 이 섹 션 에 서 는 IIS 밖에서 실행 할 수 있 는 WebListener 를 사용 합 니 다.
주의: 응용 을 IIS 에 배치 하 는 데 아직도 많은 장점 이 있 습 니 다. 예 를 들 어 안전성, 진도 관리 등 입 니 다.
procject. json 파일 에 Microsoft. AspNet. server. WebListener 패키지 추가:
"": {
    "": "",
    "": "",
    "": "",
// New:
    "": ""
},

 
다음은 procject. json 에 다음 옵션 을 추가 합 니 다.
{
// Other sections not shown
 
 
    "": {
        "": ""
    }
}

 
'commands' 에는 K 가 실 행 될 때 전달 할 미리 정 의 된 명령 목록 이 포함 되 어 있 습 니 다.이 예 에서 "웹" 은 명령 이름 으로 임의의 실제 명령 이름 값 일 수 있 습 니 다.
Microsoft. AspNet. Hosting 프로그램 집합 은 ASP. NET 5.0 응용 프로그램 을 배치 하 는 데 사 용 됩 니 다.
· -- server 표 시 는 서버 를 설명 하 는 데 사 용 됩 니 다. 이 예 에서 WebListener 입 니 다.
· -- server. urls 표 시 는 감청 할 URL 을 제공 합 니 다.
procject. json 파일 저장.Solution Explorer 에서 프로젝트 를 오른쪽 클릭 하여 Properties 를 선택 하 십시오.Properties 란 에서 Debug 를 클릭 합 니 다.Debug target 에서 'IIS Express' 를' 웹 '으로 변경 합 니 다.
clip_image001[5]
 
F5 를 누 르 면 앱 을 실행 합 니 다.Visual Studio 는 이 때 WebListener 를 시작 하 는 콘 솔 프로그램 을 실행 합 니 다.
clip_image001[7]
브 라 우 저 열기, 입력http://localhost:5000。환영 창 을 볼 수 있 습 니 다.
IIS 를 사용 할 필요 가 있다 면 이전 단계 에서 Debug Target 을 'IIS Express' 로 변경 하면 된다.
 
이 글 은 이 시리즈 의 마지막 편 으로 여러분 의 관심 에 감 사 드 립 니 다.
원본 링크:http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6
 
디 렉 터 리:
  • ASP. NET 5 시리즈 튜 토리 얼 (1): 새로운 기능 읽 기
  • ASP. NET 5 시리즈 튜 토리 얼 (2): Hello World
  • ASP. NET 5 시리즈 튜 토리 얼 (3): view components 소개
  • ASP. NET 5 시리즈 튜 토리 얼 (4): 보기 에 서 비 스 를 추가 하고 공유 클 라 우 드 에 발표 합 니 다
  • ASP. NET 5 시리즈 튜 토리 얼 (5): Visual Studio 2015 에서 Grunt, Bower 를 사용 하여 웹 프로그램 개발
  • ASP. NET 5 시리즈 튜 토리 얼 (6): MVC 6 에서 웹 API 만 들 기
  • ASP. NET 5 시리즈 튜 토리 얼 (7) 완결 편 - 판독 코드
  • 좋은 웹페이지 즐겨찾기