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