依赖注入学习总结1

生活中的“控制反转”:自己发电和用电网的电。

自己发电需要自购发电机,自学发电方法,维护发电设备等等。

用电网的电只需要付费就可以直接使用。

依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的具体实现。

依赖注入优点:

简化模块的组装过程,降低模块之间的耦合度。

控制反转的目的:

由原来的“怎样创建XX对象”→“我要XX对象”。

控制反转两种实现方式:

1.服务定位器(ServiceLocator)

2.依赖注入(Dependency Injection,DI)

依赖注入的几个概念:

服务(service):对象。

注册服务。

服务容器:负责管理注册的服务。

查询服务:创建对象及关联对象。

对象声明周期:transient(瞬态);scoped(范围);singleton(单例)。

  瞬态:每次获取都是新的对象。

  范围:在一个范围内,每次获取都是同一个对象。

  单例:在任何范围获取的都是同一个对象。

代码示例:

定义一个接口和一个实现接口的类

    public interface ITestService
    {
        public string Name { get; set; }
        public void SayHi();
    }


    public class TestServiceImpl1 : ITestService
    {
        public string Name { get; set; }

        public void SayHi()
        {
            Console.WriteLine($"hello,I'm {Name}");
        }
    }

声明类的实例对象并调用类中的方法:

        static void Main(string[] args)
        {
            //常规写法
            {
                ITestService t = new TestServiceImpl1();
                t.Name = "jam";
                t.SayHi();
            }

            //IOC写法
            {
                ServiceCollection services = new ServiceCollection(); //构造容器对象
                services.AddTransient<TestServiceImpl1>();
                using (ServiceProvider sp = services.BuildServiceProvider()) //ServiceProvider 依赖注入系统的一个核心对象,调用ServiceCollection
                {
                    ITestService t = new TestServiceImpl1();
                    t.Name = "jam";
                    t.SayHi();
                }
            }


            Console.Read();
        }

两种写法,最后的结果都是一样的:

第一种写法是常规的写法,第二种写法是IOC控制反转的实现方式。

需要引用控制反转组件 Extensions.DependencyInjection

总结:

1、可以根据类型来获取和注册服务。分别指定服务类型(service type)和实现类型(implementation type)。这两者可能相同,也可能不同。

服务类型可以是类,也可以是接口,建议面向接口编程,更灵活。

2、.net控制反转组件取名为DependencyInjection,但它包含ServiceLocator的功能。

3、.net中使用依赖注入,需要引用包Extensions.DependencyInjection。

4、ServiceCollection用来构造容器对象IServiceCollection,调用ServiceCollection的BuildServiceProvider()创建的ServiceProvider,可以用来获取BuildServiceProvider()之前ServiceCollection中的对象。

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/121315630