前言
前一篇講到了中間層的使用,可能不是那么AOP,今天主要來說下一個(gè)輕量級(jí)的AOP第三方類庫AspectoCore。
簡單介紹下這個(gè)類庫,AspectCore Project 是適用于 net core 平臺(tái)的輕量級(jí) Aop(Aspect-oriented programming) 解決方案,它更好的遵循 net core 的模塊化開發(fā)理念,使用AspectCore可以更容易構(gòu)建低耦合、易擴(kuò)展的Web應(yīng)用程序。
引入
首先,我們?cè)赨til層直接引入相關(guān)的類庫。
然后我們還是先在Startup注冊(cè)下,將ConfigureServices方法從void更改為IServiceProvider,目的就是,這個(gè)管道給別人了,不再由默認(rèn)的來了。
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...之前的
services.AddAspectCoreContainer();
return services.BuildAspectInjectorProvider();
}
自定義屬性
寫完之后,我們就可以來試試這個(gè)玩意兒怎么玩了,不多說,Util來個(gè)文件夾Attributes,然后新建一個(gè)類AprilLogAttribute,繼承AbstractInterceptorAttribute。
public class AprilLogAttribute : AbstractInterceptorAttribute
{
public async override Task Invoke(AspectContext context, AspectDelegate next)
{
LogUtil.Debug("AprilLogAttribute begin");
await next(context);
LogUtil.Debug("AprilLogAttribute end");
}
}
沒啥具體的使用注解,就是加個(gè)前后注釋的作用。然后我們?cè)谥暗腟tudent這個(gè)接口中加上一個(gè)測試方法。
public interface IStudentService : IBaseService<StudentEntity>
{
[AprilLog]
void Test();
}
StudentService我們來實(shí)現(xiàn)這個(gè)方法。
public class StudentService : BaseService<StudentEntity>, IStudentService
{
public void Test()
{
LogUtil.Debug("StudentService Test");
}
}
測試
全部搞定之后,我們繼續(xù)Values開刀,注釋掉之前的代碼之后,只留一個(gè)Test方法。
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
_service.Test();
return new string[] { "value1", "value2" };
}
別忘了運(yùn)行前在application.json里面加上接口白名單。
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"CommonSettings": {
"FilePath": "/uploads/files/"
},
"DefaultSqlConnectionString": {
"MySql": "server=127.0.0.1;userid=root;password=root;database=test;"
},
"AllowUrl": "/api/Values" //這個(gè)如果沒有那一直是返回未登錄
}
運(yùn)行沒問題,我們來看下日志記錄。
另外也補(bǔ)充下這個(gè)記錄的問題,如果需要監(jiān)視接口調(diào)用的情況,我們可以加上斷點(diǎn)看下這個(gè)context,這個(gè)對(duì)象里面本身已經(jīng)包含了我們調(diào)用了哪個(gè)接口的哪個(gè)方法等等信息,這里只舉個(gè)簡單的例子,我們可以知道我們調(diào)用的接口及方法,包括實(shí)現(xiàn)及方法,然后可以記錄下是誰訪問,哪個(gè)接口,執(zhí)行時(shí)間等等。
小結(jié)
寫到這里,net core webapi的基礎(chǔ)工程基本上已經(jīng)完工了,通過這些記錄我本身又對(duì)之前的工程進(jìn)行了小量的改動(dòng),每次的一版寫完都有一個(gè)新的感受,可能當(dāng)時(shí)寫一版的時(shí)候沒有想太多,一遍一遍的過完之后發(fā)現(xiàn)有些地方可以優(yōu)化,并且優(yōu)化的效果也是挺明顯,后續(xù)如果有新的功能實(shí)現(xiàn)或者業(yè)務(wù)需要的時(shí)候,也會(huì)同步更新的這個(gè)示例工程。