.Net依赖注入技术学习:基本模型
依赖注入技术,实现了消费者和生产者的解耦。这样说可能比较抽象,简单来说,就是一个只管使用对象或者接口,另外一个负责创建对象并管理对象的生命周期。
为什么这个技术就能够简化编程提高效率呢?
这个世界复杂性的发展有两种构型,一个是纵向分层,另外一个是横向分化组合。一个纵向分层的实例:原子、分子、细胞、器官、生物体;各层次通过横向的分化组合,构成了更高的层次,例如各器官协同工作才能构成生命体。
而依赖注入技术,在这两种构型上都有所体现。首先,接口屏蔽了实现细节,可以理解是函数更高层次的抽象,使用者只管使用它,而不必关心实现细节。另一方面,消费者和生产者的解耦,体现了专业分工、协同配合的特点。
依赖注入学习参考资料:[微软教程]
一个基本的使用模型:
1 using Microsoft.Extensions.DependencyInjection; 2 using System; 3 4 namespace ConsoleApp1 5 { 6 public interface IHello 7 { 8 void Say(); 9 } 10 11 public class Hello:IHello 12 { 13 public void Say() 14 { 15 Console.WriteLine("Hello..."); 16 } 17 } 18 class Program 19 { 20 static void Main(string[] args) 21 { 22 //创建服务容器 23 IServiceCollection services = new ServiceCollection(); 24 services.AddSingleton<IHello, Hello>(); 25 var serviceProvider = services.BuildServiceProvider(); 26 27 //调用服务 28 IHello hello=serviceProvider.GetService<IHello>(); 29 hello.Say(); 30 } 31 } 32 }
需要注意的是,需要先增加服务,再构建服务提供者。上述代码中,如果把24行和25行互换(如下代码),则hello对象为null。
var serviceProvider = services.BuildServiceProvider(); services.AddSingleton<IHello, Hello>();
但是如果重新构建服务,就没有问题了,如下代码。但是重新构建服务,有副作用,因为经过试验,发现重新构建服务,就会重新构建对象(不会立即构建,会在GetService时构建)。
//创建服务容器 IServiceCollection services = new ServiceCollection(); var serviceProvider = services.BuildServiceProvider(); services.AddSingleton<IHello, Hello>(); serviceProvider = services.BuildServiceProvider(); Console.WriteLine("此时并没有真的创建对象");
完整代码如下:
1 using Microsoft.Extensions.DependencyInjection; 2 using System; 3 4 namespace ConsoleApp1 5 { 6 public interface IHello 7 { 8 void Say(); 9 } 10 11 public class Hello:IHello 12 { 13 public Hello() 14 { 15 Console.WriteLine("调用了Hello的构造函数"); 16 } 17 public void Say() 18 { 19 Console.WriteLine("Hello..."); 20 } 21 } 22 class Program 23 { 24 static void Main(string[] args) 25 { 26 //创建服务容器 27 IServiceCollection services = new ServiceCollection(); 28 services.AddSingleton<IHello, Hello>(); 29 var serviceProvider = services.BuildServiceProvider(); 30 //调用服务 31 IHello hello =serviceProvider.GetService<IHello>(); 32 hello.Say(); 33 34 //重新构建,对象也会重新创建 35 serviceProvider = services.BuildServiceProvider(); 36 hello = serviceProvider.GetService<IHello>(); 37 hello.Say(); 38 } 39 } 40 }
程序执行输出:
调用了Hello的构造函数
Hello...
调用了Hello的构造函数
Hello...
请按任意键继续. . .