久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Asp.net core 3.1實(shí)現(xiàn)路由Url根據(jù)命名空間自動(dòng)生成

 悅光陰 2021-07-12

注:下面涉及的代碼文件可查看我的LessSharp框架Github

Asp.net core默認(rèn)的接口寫法,,每個(gè)接口控制器都得繼承自ControllerBase類,,還需具有ApiController特性及Route特性,,Route特性上還得手動(dòng)寫上路由規(guī)則,。如下圖所示

我覺得挺麻煩的,可能我比較懶,,其實(shí)我的寫的大多數(shù)的接口路徑都是按一定規(guī)則的,,一般是以命名空間Controllers.后面的命名空間做為路徑前綴,然后以[controller]/[action]路由規(guī)則進(jìn)行匹配,。

例如命名空間LessSharp.WebApi.Controllers.Sys下面的UserController控制器下面的Save接口,,那么根據(jù)命名空間的后面Sys,對(duì)應(yīng)的接口路徑值就為/Sys/User/Save

那么我希望默認(rèn)情況下,,可以以我上面的規(guī)則自動(dòng)生成路徑,如果有特殊情況的話,,那我加個(gè)Route特性,,手動(dòng)寫上我的路由規(guī)則,框架就優(yōu)先按我Route特性定義的路由路徑值,。

我實(shí)現(xiàn)的方法主要使用了Asp.net Core提供的控制器模型約定ControllerModelConvention功能,,再借助ApiConventionController控制器基類,路由生成只會(huì)在系統(tǒng)啟動(dòng)進(jìn)行生成,,所以對(duì)系統(tǒng)性能無任何影響,。

以下是ApiConventionController的代碼,這個(gè)類其實(shí)作用不大,,主要起個(gè)標(biāo)記作用,,只要繼承這個(gè)控制器基類的控制器就說明要使用以上的Url生成規(guī)則。

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")));})

最后你只要這么使用就行了,又省了不少代碼,,哈哈哈

  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多