ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
上一篇ASP.NET Core中使用IOC三部曲(二.采用Autofac來替換IOC容器,并實現屬性注入)我們講了如何將默認的容器替換為Autofac,并使用屬性注入.那么這一篇我們就來講講如何利用Autofac實現我們的AOP(面向切面編程) .
1.引用正確的庫來實現AOP
既然是跨平臺,那么在asp.net core因為采用了.net core來作為基礎庫(當然,其實你可以換成.NET4.6.).
新的.NET Core是基于.NET Standard的..所以我們在引用庫的時候特別要注意相關的兼容問題.
在傳統的ASP.NET中,使用過Autofac來進行AOP操作的,應該都知道這個庫.
Autofac.Extras.DynamicProxy
那么我們來看看它的依賴項.如圖:
在.NET Standard的情況下,他需要Autofac4.0+,這個就不多說了.關鍵在下面這個,他需要Castle.Core4.0+.
所以,當我們直接安裝這個庫的時候,Nuget會自動關聯并安裝最新的Castle.Core4.2.1版本..
那么問題就出現了..在項目的依賴項中,會發現很多警告:
?
我們進入警告會發現..都是提示缺少兼容的最新的類型轉換類.如圖:
而且Castle.Core是屬于AutoFac下面的..如圖:
我們直接通過Nuget查找Castle.Core.
可以發現,它需要System.ComponentModel.TypeConverter4.3..
我們直接安裝它,Nuget則會直接幫我們把System.ComponentModel.TypeConverter更新到4.3的版本..
然后重新通過Nuget安裝Autofac.Extras.DynamicProxy..就可以了.如圖:
?
其實這應該算一個Nuget的BUG..它會幫你引用庫的相關依賴..但是當依賴還有依賴需要更新的時候..它就不會更新..
這個時候我們換一種思維..返回來 一步步引用.就可以了..?
2.采用Autofac來實現AOP
首先,我們創建一個攔截類,代碼如下:
public class AOPTest : IInterceptor
? ? {
? ? ? ? public void Intercept(IInvocation invocation)
? ? ? ? {
? ? ? ? ? ? System.Diagnostics.Debug.WriteLine("你正在調用方法 \"{0}\"? 參數是 {1}... ",
? ? ? ? ? ? ? ?invocation.Method.Name,? ? ? ? ? ? ??
? ? ? ? ? ? ? ?string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));
? ? ? ? ? ? //在被攔截的方法執行完畢后 繼續執行? ? ? ? ? ?
? ? ? ? ? ? invocation.Proceed();
? ? ? ? ? ? System.Diagnostics.Debug.WriteLine("方法執行完畢,返回結果:{0}", invocation.ReturnValue);
? ? ? ? }
? ? }
這里,需要繼承IInterceptor,然后實現它的Intercept方法..我們直接將攔截內容輸出到調試窗(正式項目..請根據業務來操作攔截)..
找到我們要攔截的服務.并設置攔截特性(有多種方式.用特性的方式作為例子..個人也覺得特性AOP攔截比較方便),代碼如下:
[Intercept(typeof(AOPTest))]
? ? public class TestService: ITestService
? ? {
? ? ? ? public TestService()
? ? ? ? {
? ? ? ? ? ? MyProperty = Guid.NewGuid();
? ? ? ? }
? ? ? ? public Guid MyProperty { get; set; }
? ? ? ? public List<string> GetList(string a)
? ? ? ? {
? ? ? ? ? ? return new List<string>() { "LiLei", "ZhangSan", "LiSi" };
? ? ? ? }
? ? }
然后在容器中注入我們的AOP攔截類,并開啟服務的攔截狀態.代碼如下:
public class DefaultModule : Module
? ? {
? ? ? ? protected override void Load(ContainerBuilder builder)
? ? ? ? {
? ? ? ? ? ? builder.Register(c => new AOPTest());
? ? ? ? ? ? builder.RegisterType<TestService>().As<ITestService>().PropertiesAutowired().EnableInterfaceInterceptors();
? ? ? ? }
? ? }
這里注意,一定要在你注入的服務后面加上EnableInterfaceInterceptors來開啟你的攔截.
然后在控制器中調用服務的方法,代碼如下:
public class AutoDIController : Controller
? ? {
? ? ? ? public? ITestService _testService { get; set; }
? ? ? ??
? ? ? ? // GET: AutoDI
? ? ? ? public ActionResult Index()
? ? ? ? {
? ? ? ? ? ? ViewBag.date = _testService.GetList("Name");
? ? ? ? ? ? return View();
? ? ? ? }
}
然后我們運行代碼.
效果如下:
這樣,我們就完成了使用Autofac進行AOP攔截..
Autofac的AOP攔截器還有很多功能與用法.我這里就不一一舉例了..請參考官網:http://docs.autofac.org/en/latest/advanced/interceptors.html
相關文章:
ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自帶的IOC容器)
ASP.NET Core中使用IOC三部曲(二.采用Autofac來替換IOC容器,并實現屬性注入)
AspectCore中的IoC容器和依賴注入
DIP原則、IoC以及DI
全面理解 ASP.NET Core 依賴注入
依賴注入和控制反轉
ASP.NET Core 2.0 依賴注入
AspectCore中的IoC容器和依賴注入
ASP.NET Core依賴注入解讀&使用Autofac替代實現
擁抱.NET Core系列:依賴注入(1)
擁抱.NET Core系列:依賴注入(2)
學習ASP.NET Core,你必須了解無處不在的“依賴注入”
原文地址:https://www.cnblogs.com/GuZhenYin/p/8301500.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 .NET Core 中的并发编程
- 下一篇: .net的retrofit--WebAp