zoukankan      html  css  js  c++  java
  • 反射应用——依赖注入

    首先我们要下载程序包

    然后添加引用:

    using Microsoft.Extensions.DependencyInjection;
    
    

    我们用到了:
    ServiceCollection()方法,
    AddScoped()方法,每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例

    我们通过AddScoped获得实例(对象)
    BuildServiceProvider()方法,

    GetService<>()方法,

    然后我们使用到的类依然是之前用过的坦克类

        class Program
        {
            static void Main(string[] args)
            {
                /*一次性注册*/
                var sc = new ServiceCollection();//接口的实现者就是服务的提供者,new 一个容器
                sc.AddScoped(typeof(ITank), typeof(Type99));//我们可以在Scoped里要对象,
                //[ITank是静态类型,type(ITank)是拿到动态描述]
                //AddScoped(接口类型(动态类型描述),哪个类实现接口(动态类型描述)),然后把一对类型放入容器
                var sp = sc.BuildServiceProvider();
                /*===============分割线================*/
                //分割线以下,代表在程序的各个地方只要能看到ServiceProvider,你都可以这么用而不再有new操作符,我们从Contener里要对象,比如:
                ITank tank = sp.GetService<ITank>();
                tank.Fire();
                tank.Run();
            }
        }
     interface IVehicle
        {
            void Run();
        }
     interface IWeapon
        {
            void Fire();
        }
    
        interface ITank:IVehicle,IWeapon
        {
        }
    
        class Type99 : ITank
        {
            public void Fire()
            {
                Console.WriteLine("Boom!");
            }
            public void Run()
            {
                Console.WriteLine("Ka!");
            }
        }
    

    好处:
    整个开发程序过程中,千千万万个地方用到ITank这个接口引用的实例,突然有一天程序升级,要求把type99(99式坦克)升级为type19D(19式对陆强化改二丁坦克),如果在程序中用的

    ITank tank = new type99();
    

    的话,程序中所有的new操作符后面的type99()都要改成type19D。但是我们不能保证所有new type99()都改为type19D,因为有些逻辑可能还是在使用new type99()
    通过依赖注入,我们就可以只在

    sc.AddScoped(typeof(ITank), typeof(Type99));
    

    改为

    sc.AddScoped(typeof(ITank), typeof(Type19D));
    

    这样所有使用的千千万万个对象都是从Contener中拿到的,没有使用new,所以就很方便完成了程序的改动。

  • 相关阅读:
    【Yii2.0】1.5 Yii2.0新特性记录
    【PHP7.0】PHP7.0 小知识点摘录
    【PHP7.0】PHP7.0学习笔记目录
    【Yii2.0】1.4 Apache2.4.23基于主机名的虚拟主机配置
    【Yii2.0】2.2 Yii2.0 Basic代码中路由链接被转义的处理
    【Yii2.0】1.3 MySQL5.7.15修改root密码
    [Leetcode 106] 130 Surrounded Regions
    [Leetcode 105] 90 Subsets II
    [Leetcode 104] 131 Palindrome Partitioning
    [Leetcode 103] 37 Sudoku Solver
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/11641732.html
Copyright © 2011-2022 走看看