.NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)
07 | 用Autofac增強(qiáng)容器能力:引入面向切面編程(AOP)的能力
如何獲取沒有命名的服務(wù)呢?
// 獲取沒有命名的服務(wù),把 namd 去掉即可 var servicenamed = this.AutofacContainer.Resolve<IMyService>(); servicenamed.ShowCode();// Autofac 容器獲取實(shí)例的方式是一組 Resolve 方法 var service = this.AutofacContainer.ResolveNamed<IMyService>("service2"); service.ShowCode();啟動(dòng)程序,輸出如下:
MyService.ShowCode:61566768 MyServiceV2.ShowCode:44407631,NameService是否為空:True接下來,講解屬性注入
builder.RegisterType<MyNameService>(); // 只需要在注冊(cè)方法加上 PropertiesAutowired 即可 builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired();從服務(wù)里面獲取它并且 ShowCode
var servicenamed = this.AutofacContainer.Resolve<IMyService>(); servicenamed.ShowCode();啟動(dòng)程序,輸出如下:
MyServiceV2.ShowCode:11318800,NameService是否為空:False不為空,注冊(cè)成功
接下來,演示 AOP 場(chǎng)景,它指的是在不期望改變?cè)蓄惖那闆r下,在方法執(zhí)行時(shí)嵌入一些邏輯,使得可以在方法執(zhí)行的切面上任意插入邏輯
namespace DependencyInjectionAutofacDemo.Services {/// <summary>/// IInterceptor 是 Autofac 的面向切面的最重要的一個(gè)接口,它可以把邏輯注入到方法的切面里面去/// </summary>public class MyInterceptor : IInterceptor{public void Intercept(IInvocation invocation){// 方法執(zhí)行前Console.WriteLine($"Intercept before,Method:{invocation.Method.Name}");// 具體方法的執(zhí)行,如果這句話不執(zhí)行,相當(dāng)于把切面的方法攔截掉,讓具體類的方法不執(zhí)行invocation.Proceed();// 方法執(zhí)行后,也就是說可以在任意的方法執(zhí)行后,插入執(zhí)行邏輯,并且決定原有的方法是否執(zhí)行Console.WriteLine($"Intercept after,Method:{invocation.Method.Name}");}} }如何啟動(dòng)切面?
// 把攔截器注冊(cè)到容器里面 builder.RegisterType<MyInterceptor>(); // 注冊(cè) MyServiceV2,并且允許它屬性注冊(cè) (PropertiesAutowired) // 開啟攔截器需要使用 InterceptedBy 方法,并且注冊(cè)類型 MyInterceptor // 最后還要執(zhí)行一個(gè)開關(guān) EnableInterfaceInterceptors 允許接口攔截器 builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(MyInterceptor)).EnableInterfaceInterceptors();攔截器分兩種類型,一種是接口攔截器,一種是類攔截器
常用的是接口攔截器,當(dāng)服務(wù)類型是接口的時(shí)候,就需要使用這種方式
如果沒有基于接口設(shè)計(jì)類,而是實(shí)現(xiàn)類的時(shí)候,就需要用類攔截器
類攔截器需要把方法設(shè)計(jì)為虛方法,這樣子允許類重載的情況下,才可以攔截到具體的方法
啟動(dòng)程序,輸出如下:
Intercept before,Method:ShowCode MyServiceV2.ShowCode:31780825,NameService是否為空:True Intercept after,Method:ShowCode接下來看一下子容器的用法
// Autofac 具備給子容器進(jìn)行命名的特性,可以把以服務(wù)注入到子容器中,并且是特定命名的子容器,這就意味著在其他的子容器是獲取不到這個(gè)對(duì)象的 builder.RegisterType<MyNameService>().InstancePerMatchingLifetimeScope("myscope");創(chuàng)建一個(gè) myscope 的子容器
using (var myscope = AutofacContainer.BeginLifetimeScope("myscope")) {var service0 = myscope.Resolve<MyNameService>();using (var scope = myscope.BeginLifetimeScope()){var service1 = scope.Resolve<MyNameService>();var service2 = scope.Resolve<MyNameService>();Console.WriteLine($"service1=service2:{service1 == service2}");Console.WriteLine($"service1=service0:{service1 == service0}");} }啟動(dòng)程序,輸出如下:
service1=service2:True service1=service0:True這意味著在 myscope 子容器下面,不管再創(chuàng)建任何子容器的生命周期,得到的都是同一個(gè)對(duì)象
這樣子的好處是當(dāng)不期望這個(gè)對(duì)象在根容器創(chuàng)建時(shí),又希望它在某一定的范圍內(nèi)時(shí)單例模式的情況下,可以使用這種方式
總結(jié)
以上是生活随笔為你收集整理的.NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在树莓派上使用 PowerShell 调
- 下一篇: gRPC in ASP.NET Core