.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

 




 

posted @ 2025-05-26 21:25  逆流而下  阅读(22)  评论(0)    收藏  举报