.net core系列之《對AOP思想的理解及使用AspectCore實現自定義日誌攔截》
阿新 • • 發佈:2018-09-28
gets 接口 日誌 核心 自己的 程序 的人 但是 tar
對於AOP這個名詞,相信對於搞過MVC開發的人來說,都很熟悉,裏面各種各樣的Filter簡直是將AOP體現到了極致。
那麽什麽是AOP呢?
AOP(Aspect Oriented Programming,面向切面編程),它是可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。它是一種新的方法論,它是對傳統OOP編程的一種補充。OOP是關註將需求功能劃分為不同的並且相對獨立,封裝良好的類,並讓它們有著屬於自己的行為,依靠繼承和多態等來定義彼此的關系;AOP是希望能夠將通用需求功能從不相關的類當中分離出來,能夠使得很多類共享一個行為,一旦發生變化,不必修改很多類,而只需要修改這個行為即可。AOP是使用切面(aspect)將橫切關註點模塊化,OOP是使用類將狀態和行為模塊化。在OOP的世界中,程序都是通過類和接口組織的,使用它們實現程序的核心業務邏輯是十分合適。但是對於實現橫切關註點(跨越應用程序多個模塊的功能需求)則十分吃力,比如日誌記錄,權限驗證,異常攔截等。
現在我們將在.net core項目中用AspectCore來實現自定義攔截功能
github地址:https://github.com/dotnetcore/AspectCore-Framework
1、在NuGet包中搜索 AspectCore.Extensions.DependencyInjection 並安裝
2、然後我們自定一個記錄日誌的攔截器
public class LoggerInterceptorAttribute : AbstractInterceptorAttribute { public async override Task Invoke(AspectContext context, AspectDelegate next) { Console.WriteLine("開始記錄日誌"); await next.Invoke(context); Console.WriteLine("結束記錄日誌"); } }
3、然後將攔截器以特性的方式實現
public interface IUserRepository { void GetUser(); } public class UserRepository : IUserRepository { [LoggerInterceptor] public voidGetUser() { Console.WriteLine("獲取用戶信息業務邏輯"); } } static void Main(string[] args) { var userRepository = new ServiceCollection() .AddTransient<IUserRepository, UserRepository>() .BuildAspectInjectorProvider() .GetService<IUserRepository>(); userRepository.GetUser(); Console.ReadKey(); }
結果如下:
.net core系列之《對AOP思想的理解及使用AspectCore實現自定義日誌攔截》