反射应用——依赖注入

首先我们要下载程序包

然后添加引用:

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,所以就很方便完成了程序的改动。

posted @ 2019-10-09 14:44  卯毛  阅读(397)  评论(0编辑  收藏  举报