ASP.NET Core MVC 전역 경로 접두사 설정

ASP.NET Core MVC 전역 경로 접두사 설정
머리말
안녕하세요,오늘 은 ASP.NET Core MVC 의 새로운 기능 을 소개 합 니 다.전체 경로 에 통일 접 두 사 를 추가 합 니 다.엄 밀 히 말 하면 새로운 특성 은 아니 지만 코어 MVC 특유 의 것 에 불과 하 다.
응용 배경
여러분 이 웹 Api 프로그램 을 할 때 이런 장면 을 본 적 이 있 는 지 모 르 겠 습 니 다.모든 인터페이스 가/api 로 시작 되 는 것 입 니 다.즉,우리 의 api 인터페이스 요청 주 소 는 다음 과 같 습 니 다.
http://www.example.com/api/order/333
아니면 이런 수요.
http://www.example.com/api/v2/order/333
이전에 우리 가 이러한 수 요 를 실현 하려 면 Controller 에[Route("/api/order")]를 추가 할 수 있 습 니 다.이러한 특성 은 Attribute 에서 MVC 프레임 워 크 는 경로 표를 스 캔 하여/api/order 와 같은 요청 에 일치 할 수 있 습 니 다.
그러나 두 번 째 버 전 번호 에 대한 수 요 는 원래 Controller 의 Route 정 의 는[Route("/api/v1/order")]였 는데 지금 은 v2 로 업그레이드 하려 면 수백 개의 인터페이스 가 있 기 때문에 하나의 수정 이 필요 하고 어 리 석 을 수 있 습 니 다.
이제 좀 더 간편 하고 우아 한 방법 으로 이 일 을 할 수 있 습 니 다.전체적인 접두사 로 표 시 를 통일 적 으로 추가 할 수 있 습 니 다.다음은 함께 보 겠 습 니 다.
IApplicationModelConvention 인터페이스
우선,우 리 는 IApplicationModelConvention 라 는 인 터 페 이 스 를 사용 해 야 합 니 다.Microsoft.AspNetCore.Mvc.ApplicationModels 네 임 스페이스 에서 인터페이스의 정 의 를 살 펴 보 겠 습 니 다.

public interface IApplicationModelConvention
{
 void Apply(ApplicationModel application);
}
 
우 리 는 MVC 프레임 워 크 에 약 속 된 것 이 있다 는 것 을 알 고 있다.그러면 이 인 터 페 이 스 는 주로 MVC 가 약속 한 것 을 사용자 정의 하 는 것 이다.우 리 는 applicationModel 대상 을 지정 하여 약속 을 추가 하거나 수정 할 수 있다.인터페이스 가 Apply 방법 을 제공 하 는 것 을 볼 수 있 습 니 다.이 방법 은 ApplicationModel 대상 이 있 습 니 다.우 리 는 이 대상 을 이용 하여 우리 가 필요 로 하 는 것 을 수정 할 수 있 습 니 다.MVC 프레임 워 크 자체 가 시작 할 때 이 인 터 페 이 스 를 Services 에 주입 하기 때문에 우 리 는 이 인 터 페 이 스 를 실현 한 다음 에 조금 만 설정 하면 됩 니 다.
그러면 애플 리 케 이 션 모델 이라는 대상 에 게 어떤 것들 이 있 는 지 다시 한 번 보 여 주세요.

public class ApplicationModel : IPropertyModel, IFilterModel, IApiExplorerModel
{
 public ApiExplorerModel ApiExplorer { get; set; }
 public IList<ControllerModel> Controllers { get; }
 public IList<IFilterMetadata> Filters { get; }

 public IDictionary<object, object> Properties { get; }
}

ApiExplorer,Controllers,Filters,Properties 등의 속성 을 볼 수 있 습 니 다.
  • ApiExplorer 모델:기본 MVC Api Explorer 를 설정 하 는 것 입 니 다.Api 의 설명 정보,그룹 정보,가시 성 등 을 포함 합 니 다
  • Controller Model:주로 Comtroller 의 기본 약속 과 관련 된 것 입 니 다.이 안에 물건 이 비교적 많 으 니 일일이 소개 하지 않 겠 습 니 다.우 리 는 잠시 후에 안에 있 는 물건 을 배치 해 야 합 니 다
  • IFilterMetadata:빈 인터페이스,주로 태그 역할 을 합 니 다.
  • 또 하나 알려 드릴 것 은 위의 Controllers 속성 을 볼 수 있 습 니 다.이것 은 IList입 니 다.즉,이 목록 에 프로그램의 모든 Controller 정 보 를 기록 하고 있 습 니 다.옮 겨 다 니 는 방식 으로 특정한 부분 이나 특정한 Controller 를 설정 할 수 있 습 니 다.Controller 의 Actions 를 포함 한 정 보 는 모두 이런 방식 으로 설정 할 수 있 습 니 다.우 리 는 이 특성 을 이용 하여 MVC 프레임 워 크 를 유연 하 게 개조 할 수 있 습 니 다.멋 있 지 않 습 니까?
    다음은 이 특성 을 이용 하여 오늘 의 주 제 를 실현 하 겠 습 니 다.좋아요 눌 러 주 셔 서 감사합니다~:)
    전역 경로 통일 접두사 추가
    쓸데없는 말 이 많 지 않 습 니 다.코드 에 직접 올 리 고 할 말 은 모두 코드 에 있 습 니 다.
    
    //    RouteConvention,    IApplicationModelConvention   
    public class RouteConvention : IApplicationModelConvention
    {
     private readonly AttributeRouteModel _centralPrefix;
    
     public RouteConvention(IRouteTemplateProvider routeTemplateProvider)
     {
      _centralPrefix = new AttributeRouteModel(routeTemplateProvider);
     }
    
     //   Apply  
     public void Apply(ApplicationModel application)
     {
      //      Controller
      foreach (var controller in application.Controllers)
      {
       //       RouteAttribute   Controller
       var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList();
       if (matchedSelectors.Any())
       {
        foreach (var selectorModel in matchedSelectors)
        {
         //                    
         selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix,
          selectorModel.AttributeRouteModel);
        }
       }
    
       //      RouteAttribute   Controller
       var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList();
       if (unmatchedSelectors.Any())
       {
        foreach (var selectorModel in unmatchedSelectors)
        {
         //          
         selectorModel.AttributeRouteModel = _centralPrefix;
        }
       }
      }
     }
    }
    
    
    그런 후에 우 리 는 우리 가 정의 한 이런 종 류 를 사용 할 수 있다.
    
    public static class MvcOptionsExtensions
    {
     public static void UseCentralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute)
     {
      //           IApplicationModelConvention RouteConvention
      opts.Conventions.Insert(0, new RouteConvention(routeAttribute));
     }
    }
    
    마지막 으로 Startup.cs 파일 에 위의 확장 방법 을 추가 하면 됩 니 다.
    
    public class Startup
    {
     public Startup(IHostingEnvironment env)
     {
      //...
     }
    
     public void ConfigureServices(IServiceCollection services)
     {
      //...
      
      services.AddMvc(opt =>
      {
       //              ,         
       opt.UseCentralRoutePrefix(new RouteAttribute("api/v{version}"));
      });
     }
    
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
     {
      //...
      
      app.UseMvc();
     }
    }
    
    
    그 중에서 opt.UseCentral Route Prefix 는 위 에서 정의 한 확장 방법 입 니 다.이 곳 은 매개 변 수 를 사용 할 수 있 기 때문에 인터페이스 에 버 전 번 호 를 지정 할 수 있 습 니 다.그 후에 모든 Controller 의 Rote Attribute 에 이 접 두 사 를 추가 하면 최초의 버 전 번호 에 대한 수 요 를 완벽 하 게 해결 할 수 있 습 니 다.그들 은 대략 이렇게 보인다.
    
    [Route("order")]
    public class OrderController : Controller
    {
     //      : /api/v{version}/order/details/{id}
     [Route("details/{id}")]
     public string GetById(int id, int version)
     {
      //            ,   version   id
      return $"other resource: {id}, version: {version}";
     }
    }
    
    public class ItemController : Controller
    {
     //     : /api/v{version}/item/{id}
     [Route("item/{id}")]
     public string GetById(int id, int version)
     {
      //            ,   version   id
      return $"item: {id}, version: {version}";
     }
    }
    
    
    총결산
    위의 흑체 글 자 는 여러분 이 이해 하고 활용 하 시기 바 랍 니 다.이 예 는 실제 수요 중의 아주 작은 장면 일 뿐 구체 적 인 프로젝트 에서 여러 가지 정상 적 이거 나 비정 상 수요 가 있 습 니 다.우 리 는 하나의 기능 을 할 때 많이 생각해 야 합 니 다.사실은 MVC 구 조 는 아직도 배 울 수 있 는 것 이 많 습 니 다.이 는 디자인 사상,확장 성 등 을 포함 합 니 다.다 천천히 깨 달 아야 돼.만약 여러분 들 이 ASP.NET Core 에 관심 이 있다 면 저 를 주목 해 주세요.저 는 정기 적 으로 블 로그 에서 제 학습 성 과 를 공유 하 겠 습 니 다.
    이 글 을 통 해 여러분 을 도 울 수 있 기 를 바 랍 니 다.여러분 의 본 사이트 에 대한 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기