前言
前一篇講到了中間層的使用,可能不是那么AOP,今天主要來說下一個輕量級的AOP第三方類庫AspectoCore。
簡單介紹下這個類庫,AspectCore Project 是適用於 net core 平台的輕量級 Aop(Aspect-oriented programming) 解決方案,它更好的遵循 net core 的模塊化開發理念,使用AspectCore可以更容易構建低耦合、易擴展的Web應用程序。
引入
首先,我們在Util層直接引入相關的類庫。
然后我們還是先在Startup注冊下,將ConfigureServices方法從void更改為IServiceProvider,目的就是,這個管道給別人了,不再由默認的來了。
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...之前的
services.AddAspectCoreContainer();
return services.BuildAspectInjectorProvider();
}
自定義屬性
寫完之后,我們就可以來試試這個玩意兒怎么玩了,不多說,Util來個文件夾Attributes,然后新建一個類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");
}
}
沒啥具體的使用注解,就是加個前后注釋的作用。然后我們在之前的Student這個接口中加上一個測試方法。
public interface IStudentService : IBaseService<StudentEntity>
{
[AprilLog]
void Test();
}
StudentService我們來實現這個方法。
public class StudentService : BaseService<StudentEntity>, IStudentService
{
public void Test()
{
LogUtil.Debug("StudentService Test");
}
}
測試
全部搞定之后,我們繼續Values開刀,注釋掉之前的代碼之后,只留一個Test方法。
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
_service.Test();
return new string[] { "value1", "value2" };
}
別忘了運行前在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" //這個如果沒有那一直是返回未登錄
}
運行沒問題,我們來看下日志記錄。
另外也補充下這個記錄的問題,如果需要監視接口調用的情況,我們可以加上斷點看下這個context,這個對象里面本身已經包含了我們調用了哪個接口的哪個方法等等信息,這里只舉個簡單的例子,我們可以知道我們調用的接口及方法,包括實現及方法,然后可以記錄下是誰訪問,哪個接口,執行時間等等。
小結
寫到這里,net core webapi的基礎工程基本上已經完工了,通過這些記錄我本身又對之前的工程進行了小量的改動,每次的一版寫完都有一個新的感受,可能當時寫一版的時候沒有想太多,一遍一遍的過完之后發現有些地方可以優化,並且優化的效果也是挺明顯,后續如果有新的功能實現或者業務需要的時候,也會同步更新的這個示例工程。