概念

:::info

  1. DIP(依赖倒置原则):六大设计原则里面一种设计原则,它转换了依赖关系,高层模块不依赖于底层模块的实现,而低层模块要依赖于高层模块的接口定义,总的原则就是高层和底层都不互相依赖,两者都依赖与抽象,抽象不依赖于实现,实现应该依赖于抽象
  2. IOC(控制反转):一种反转流、依赖和接口的方式(DIP的具体实现方式)
  3. DI(依赖注入):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)
  4. IoC容器:依赖注入的框架,用来映射依赖,管理对象创建和生存周期(DI框架)。
IOC思想就是把类当做组件或服务来看待,组件内一定要高内聚,组件之间一定要低耦合,既然要保持低耦合,那就一定不要轻易的去new什么对象。组件之间的交互最好的方式就是把new的操作交给第三方的IOC治理框架去做.

5.IOC容器能做到哪些

对接口和实现类实现了由原来的零散式管理到现在的集中化管理

对类之间,类接口之间的关联关系可以采用多种模式注入(构造器注入,属性注入)等等。

**** 对实现类的生命周期进行了统一管理,能够控制服务的创建,释放和监控。

****类的依赖由编译时推迟到了运行时

  1. 微软重新设计的asp.net core 就是基于内建容器ServiceCollection,其实就一个IOC容器,在asp.net core出来之前也有好几种IOC容器如:Autofac、Unity等等

:::

:::info

Transient:每次从容器 (IServiceProvider)中获取的时候都是一个新的实例 Singleton:每次从同根容器中( IServiceProvider)获取的时候都是同一个实例

Scoped:同一个请求中从同一个容器中( IServiceProvider)获取的实例是相同的实例

:::

实例代码

:::info

  • Nuget先下载DI包: Microsoft.Extensions.DependencyInjection

:::

  1. //接口类
  2. public interface ITest {
  3. public string Name { get; set; }
  4. public void SayHi();
  5. }
  6. //实现类
  7. public class Test1 : ITest
  8. {
  9. public string t1 { get; set; } = Guid.NewGuid().ToString();
  10. public string Name { get; set; }
  11. public void SayHi()
  12. {
  13. Console.WriteLine($"Hello,I'am {Name} ---{t1}");
  14. }
  15. }
  16. static void Main(string[] args)
  17. {
  18. //IOC容器
  19. ServiceCollection services = new ServiceCollection();
  20. services.AddScoped<Test1>(); //注册服务
  21. using (ServiceProvider sp=services.BuildServiceProvider())
  22. {
  23. using (IServiceScope ss1 = sp.CreateScope())
  24. {
  25. //从IOC容器取Ibird实例对象
  26. Test1 tt1= ss1.ServiceProvider.GetService<Test1>();
  27. tt1.Name = "www";
  28. tt1.SayHi();
  29. Test1 tt2 = ss1.ServiceProvider.GetService<Test1>();
  30. tt2.Name = "w3";
  31. tt1.SayHi();
  32. Console.WriteLine(object.ReferenceEquals(tt1,tt2));
  33. }
  34. }
  35. Console.Read();
  36. }