.NET中DI服务的注册


1. DI的几个概念

  1. 服务(service):对象
  2. 注册服务
  3. 服务容器:负责管理注册的服务
  4. 查询服务:创建对象及关联对象
  5. 对象声明周期:Transient(瞬态),Scoped(范围),Singleton(单例)

2. .NET中使用DI

  1. 根据类型来获取和注册服务。可以分别指定服务类型(service type)和实现类型(implementation type)。这两者可能相同,也可能不同。服务类型可以是类,也可以是接口,建议面向接口编程,这样更加灵活。
  2. .NET中控制反转组件取名为DependencyInjection,但它包含之前提到过的服务定位器(ServiceLocator)功能。
  3. 要使用控制反转,我们需要先安装所需要的包
    Install-Package Microsoft.Extensions.DependencyInjection
    
    using Microsoft.Extensions.DependencyInjection
    
    (以下建成DI组件)
  4. 在DI组件中,ServiceCollection负责构造容器对象。调用ServiceCollection的BuildServiceProvider()方法创建的ServiceProvider,可以获取BuildServiceProvider()之前ServiceCollection中的对象。

学习了DI的使用方法,尝试将下面的代码改造成使用依赖注入的方式: 示例代码:

namespace _2_24依赖注入
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ITestService service = new TestServiceImpl();
            service.Name = "Ron";
            service.SayHi();
        }
    }

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

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

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

改造之后:

namespace _2_25.NET中DI服务注册
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddTransient<TestServiceImpl>();
            using(ServiceProvider serviceProvider = services.BuildServiceProvider())
            {
                TestServiceImpl testService=serviceProvider.GetService<TestServiceImpl>();
                testService.Name = "Ron";
                testService.SayHi();
            }
        }

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

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

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

    }
}

本文章使用limfx的vscode插件快速发布