.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号