14、ioc+di

 

ioc:Inversion of Control 控制反转

大家都翻译成【控制反转】,但是有些东西翻译成中文就变了味道,在我的理解,Inversion of Control 这个词应该理解成【控制委托】

di:Dependency Injection 依赖注入

依赖注入是Ioc的实现,不多说,完后看

 

举个栗子,小明衣服脏了,要自己洗衣服,然后按照小明洗衣服的流程,先打开洗衣机,扔进去衣服,开洗,然后等待衣服洗完把衣服拿出来,等到干净的衣服。有一天小明觉得,这个事儿不应该我来做,我只需要有洗衣服这个想法,还有最后获得干净的衣服,怎么洗我不想管,于是小明找了个管家,小明把洗衣服这个事儿就交给管家了,每次小明想洗衣服的时候,就大喊一声,我要洗衣服,然后管家就来了,他把衣服送到干洗店,有时候手洗,有时候不洗,然后把衣服交到小明手里,说衣服洗好了。这个过程从原来洗衣服由小明一手操控,到把实现交给管家只关心结果,就是我对Ioc的理解。下面进行角色分解:

小明:业务调用者,可以是controller,service

洗衣服:需要用到的服务方法

管家:Ioc容器

请管家:向Ioc容器加入洗衣服服务

大喊洗衣服:从Ioc容器类型解析,获取洗衣服服务

管家洗衣服:执行服务

回头看上面的两个概念,di是ioc的一种实现,为什么这么说,小明由原来的自己洗衣服,变成交给别人洗,就是ioc的概念(不太贴切,但是概念这种东西,可意会不可言传),他怎么实现的呢?就是找了个大管家,告诉他我需要你,帮我洗衣服,就是di

 

下面用代码来演示一下,加深印象(.net core 3.1)

创建控制台应用,代码如下

using Microsoft.Extensions.DependencyInjection;
using System;
namespace Ares.Ioc
{
    class Program
    {
        static void Main(string[] args)
        {
            // 非Ioc实现
            IPerson person = new XiaoMing();
            person.WashClothes("小明自己洗衣服");

            // Ioc实现
            var serviceCollection = new ServiceCollection();
            serviceCollection.AddTransient<IPerson, XiaoMing>();
            var serviceProvider = serviceCollection.BuildServiceProvider();
            using (var scope = serviceProvider.CreateScope())
            {
                scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服");
                scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服");

            }
            using (var scope = serviceProvider.CreateScope())
            {
                scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服");
                scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服");
            }
        }
    }
    public interface IPerson
    {
        void WashClothes(string washType);
    }
    public class XiaoMing : IPerson
    {
        public void WashClothes(string washType)
        {
            Console.WriteLine(washType + this.GetHashCode());
        }
    }
}

  

.net core 依赖注入的简单实现

 

然后看一下 AddTransient AddSingleton AddScoped 这三种方法的生命周期

AddSingleton 运行结果 ,hashcode没有变化,也就是全生命周期,都是一样的

 

 AddScoped 运行结果 同生命周期内没变化

 

 AddTransient 运行结果,全都变了,也就是调用一次实例化一次

 

posted @ 2020-06-08 13:51  AresYM  阅读(174)  评论(0编辑  收藏  举报