前一篇講到了中間層的使用,可能不是那麼AOP,今天主要來講下一個輕量級的AOP第三方類庫AspectoCore。json
簡單介紹下這個類庫,AspectCore Project 是適用於 net core 平臺的輕量級 Aop(Aspect-oriented programming) 解決方案,它更好的遵循 net core 的模塊化開發理念,使用AspectCore能夠更容易構建低耦合、易擴展的Web應用程序。api
首先,咱們在Util層直接引入相關的類庫。app
而後咱們仍是先在Startup註冊下,將ConfigureServices方法從void更改成IServiceProvider,目的就是,這個管道給別人了,再也不由默認的來了。async
public IServiceProvider ConfigureServices(IServiceCollection services) { //...以前的 services.AddAspectCoreContainer(); return services.BuildAspectInjectorProvider(); }
寫完以後,咱們就能夠來試試這個玩意兒怎麼玩了,很少說,Util來個文件夾Attributes,而後新建一個類AprilLogAttribute,繼承AbstractInterceptorAttribute。ide
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裏面加上接口白名單。ui
{ "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的基礎工程基本上已經完工了,經過這些記錄我自己又對以前的工程進行了小量的改動,每次的一版寫完都有一個新的感覺,可能當時寫一版的時候沒有想太多,一遍一遍的過完以後發現有些地方能夠優化,而且優化的效果也是挺明顯,後續若是有新的功能實現或者業務須要的時候,也會同步更新的這個示例工程。