zoukankan      html  css  js  c++  java
  • 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 运行结果,全都变了,也就是调用一次实例化一次

  • 相关阅读:
    2018常用网站 图片处理
    iOS判断当前时间是否处于某个时间段内
    iOS 页面跳转和返回,持续编写
    模板引擎-freemarker
    HibernateTemplate使用注意点
    hibernate-注解及配置
    hibernate 异常
    javaEncode
    eclipse 创建注释模板
    eclipse 和 javaClass
  • 原文地址:https://www.cnblogs.com/ares-core/p/13065254.html
Copyright © 2011-2022 走看看