ASP.NET Core MVC 전역 경로 접두사 설정
6709 단어 ASP.NETCoreMVC전역 경로 접두사 설정
머리말
안녕하세요,오늘 은 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 등의 속성 을 볼 수 있 습 니 다.다음은 이 특성 을 이용 하여 오늘 의 주 제 를 실현 하 겠 습 니 다.좋아요 눌 러 주 셔 서 감사합니다~:)
전역 경로 통일 접두사 추가
쓸데없는 말 이 많 지 않 습 니 다.코드 에 직접 올 리 고 할 말 은 모두 코드 에 있 습 니 다.
// 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 에 관심 이 있다 면 저 를 주목 해 주세요.저 는 정기 적 으로 블 로그 에서 제 학습 성 과 를 공유 하 겠 습 니 다.
이 글 을 통 해 여러분 을 도 울 수 있 기 를 바 랍 니 다.여러분 의 본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
.Net Core Excel 템플릿 읽기 Excel 파일 내보내기텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.