.Net8-01-DependencyInjection
試試 面向接口編程
//**Nuget添加 Microsoft.Extensions.DependencyInjection
1、定義動物接口
interface IAnimal { void Cry(); } public class Dog : IAnimal { public void Cry() { Console.WriteLine("汪汪············"); Console.WriteLine($"Dog:{this.GetHashCode()}"); } } void DependencyInjectionTest() { #region 依賴接口 //1.創建依賴注入容器 ServiceCollection services = new ServiceCollection(); //2.注冊相關依賴 services.AddSingleton<IAnimal, Dog>(); //3.獲取容器服務對象 ServiceProvider serviceProvider = services.BuildServiceProvider(); //4.獲取對象 IAnimal animal = serviceProvider.GetRequiredService<IAnimal>(); animal.Cry(); #endregion } //調用 DependencyInjectionTest(); //結果 汪汪············ Dog:21083178
2.依賴注入的生命周期
1 AddSingleton: 單例 創建對象在整個項目中,只有一個實例 2 測試如下: 3 //1.創建依賴注入容器 4 ServiceCollection services = new ServiceCollection(); 5 //2.注冊相關依賴 6 services.AddSingleton<IAnimal,Dog>(); 7 //3.獲取容器服務對象 8 ServiceProvider serviceProvider = services.BuildServiceProvider(); 9 //4.獲取對象 10 IAnimal animal = serviceProvider.GetRequiredService<IAnimal>(); 11 animal.Cry(); 12 IAnimal animal1 = serviceProvider.GetRequiredService<IAnimal>(); 13 animal1.Cry(); 14 15 結果: 16 汪汪············ 17 Dog:21083178 18 汪汪············ 19 Dog:21083178
AddTransient: 多例 在每次獲取對象的時候,都重新創建一個新的對象。 測試: //1.創建依賴注入容器 ServiceCollection services = new ServiceCollection(); //2.注冊相關依賴 //services.AddSingleton<IAnimal,Dog>(); services.AddTransient<IAnimal,Dog>(); //3.獲取容器服務對象 ServiceProvider serviceProvider = services.BuildServiceProvider(); //4.獲取對象 IAnimal animal = serviceProvider.GetRequiredService<IAnimal>(); animal.Cry(); IAnimal animal1 = serviceProvider.GetRequiredService<IAnimal>(); animal1.Cry();
AddTransient :在一個作用域內。保證對象是單例 測試: //1.創建依賴注入容器 ServiceCollection services = new ServiceCollection(); //2.注冊相關依賴 //services.AddSingleton<IAnimal,Dog>(); services.AddTransient<IAnimal,Dog>(); //3.獲取容器服務對象 ServiceProvider serviceProvider = services.BuildServiceProvider(); IServiceScope serviceScope = serviceProvider.CreateScope(); { IAnimal animal = serviceScope.ServiceProvider.GetRequiredService<IAnimal>(); animal.Cry(); } { IAnimal animal = serviceScope.ServiceProvider.GetRequiredService<IAnimal>(); animal.Cry(); } 結果: 汪汪············ Dog:21083178 汪汪············ Dog:55530882
結果: 汪汪············ Dog:21083178 汪汪············ Dog:55530882
.Net8 使用這個 Microsoft.Extensions.DependencyInjection 存在以下缺點:
1.不能批量注入
2.只能通過構造函數注入
3.不能過濾
怎么辦? Autofac
NuGet 添加 Autofac.Extensions.DependencyInjection 依賴
public class Cat : IAnimal { //屬性注入 public Cat cat { get; set; } public void Cry() { Console.WriteLine($"Cat 喵喵····"); Console.WriteLine($"Cat :{this.GetHashCode()}"); } } void AutoFacDependencyInjectionTest() { //1. 創建autofac容器 ContainerBuilder containerBuilder = new ContainerBuilder(); //2. 注冊 containerBuilder.RegisterType<Cat>().As<IAnimal>().PropertiesAutowired(); //3.容器服務 IContainer container = containerBuilder.Build(); //4.獲取對象 IAnimal cat = container.Resolve<IAnimal>(); cat.Cry(); } 運行結果: Cat 喵喵···· Cat :55909147
autofac批量注入
///autofac批量注入 void AutoFacDependencyInjectionTest1() { //1. 創建autofac容器 ContainerBuilder containerBuilder = new ContainerBuilder(); //2. 整個“項目”注冊 containerBuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .AsImplementedInterfaces() //只要有接口都實現注冊 .PropertiesAutowired(); //依賴屬性自動注入 //3.容器服務 IContainer container = containerBuilder.Build(); //4.獲取所以注冊對象的實例 var animals = container.Resolve<IEnumerable<IAnimal>>(); foreach (var item in animals) { item.Cry(); } } 運行結果: Cat 喵喵···· Cat :56680499 汪汪············ Dog:40362448 Sheep 咩咩···· Sheep:27717712

浙公網安備 33010602011771號