注:下面涉及的代碼文件可查看我的LessSharp框架Github 按 我覺得挺麻煩的,可能我比較懶,,其實(shí)我的寫的大多數(shù)的接口路徑都是按一定規(guī)則的,,一般是以命名空間Controllers.后面的命名空間做為路徑前綴,然后以 例如命名空間 那么我希望默認(rèn)情況下,,可以以我上面的規(guī)則自動(dòng)生成路徑,如果有特殊情況的話,,那我加個(gè) 我實(shí)現(xiàn)的方法主要使用了 以下是 namespace LessSharp.WebApi.Controllers {/// <summary>/// 繼承此控制器后,,會(huì)自動(dòng)根據(jù)命名空間結(jié)構(gòu)修改Route增加前綴/// 例如LessSharp.WebApi.Controllers.Sys.A.B命名空間下的UserController控制器,,就會(huì)生成Sys/A/B/User這樣的路由/// 如果派生控制器有自定義Route特性的話,就不會(huì)自動(dòng)增加前綴/// </summary>[Route("[controller]/[action]")] [ApiController]public abstract class AutoRouteControllerBase : ControllerBase { } 以下是這個(gè)Url生成功能最核心的類AutoRouteControllerModelConvention,它實(shí)現(xiàn)IControllerModelConvention接口 namespace LessSharp.WebApi.Conventions {public class AutoRouteControllerModelConvention : IControllerModelConvention {/// <summary>/// 路徑前綴/// </summary>private readonly string _prefix;public AutoRouteControllerModelConvention (string prefix) { _prefix = prefix; }public void Apply(ControllerModel controller) {//判斷是否是ApiConventionController的派生控制器if (controller.ControllerType.BaseType != typeof(AutoRouteControllerBase)) {return; }//判斷是否有自定義Route特性if (controller.ControllerType.GetCustomAttributes(typeof(RouteAttribute), false).Length > 0) {return; }string controllerNamespace = controller.ControllerType.Namespace;string temp = "Controllers.";int index = controllerNamespace.IndexOf(temp);string prefix = _prefix.Trim('/');if (index > -1) { prefix += "/" + controllerNamespace.Substring(index + temp.Length); }if (string.IsNullOrEmpty(prefix)) {return; }if (!string.IsNullOrEmpty(prefix)) { prefix = prefix.Replace(".", "/"); } foreach (var selector in controller.Selectors.Where(s => s.AttributeRouteModel != null)) { selector.AttributeRouteModel.Template = prefix + "/" + selector.AttributeRouteModel.Template; } } } } 最后在Startup的ConfigureServices方法里添加這個(gè)約定,。我這里還添加了根據(jù)配置文件的RoutePrefix值統(tǒng)一添加Url前綴的功能 services.AddControllers(o =>{//添加約定器,,對(duì)ApiConventionController的派生類添加路由前綴o.Conventions.Add(new AutoRouteControllerModelConvention(Configuration.GetValue<string>("RoutePrefix")));}) 最后你只要這么使用就行了,又省了不少代碼,,哈哈哈
|
|