.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 }
View Code

 需要注意的是,需要先增加服务,再构建服务提供者。上述代码中,如果把24行和25行互换(如下代码),则hello对象为null。

var serviceProvider = services.BuildServiceProvider();
services.AddSingleton<IHello, Hello>();
View Code

 但是如果重新构建服务,就没有问题了,如下代码。但是重新构建服务,有副作用,因为经过试验,发现重新构建服务,就会重新构建对象(不会立即构建,会在GetService时构建)。

            //创建服务容器
            IServiceCollection services = new ServiceCollection();
            var serviceProvider = services.BuildServiceProvider();
            services.AddSingleton<IHello, Hello>();
            serviceProvider = services.BuildServiceProvider();
            Console.WriteLine("此时并没有真的创建对象");
View Code

完整代码如下:

 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 }
View Code

 

程序执行输出:

调用了Hello的构造函数
Hello...
调用了Hello的构造函数
Hello...
请按任意键继续. . .

posted @ 2021-02-07 11:21  顺其自然,道法自然  阅读(137)  评论(0编辑  收藏  举报