.NET依赖注入


1. 依赖注入

  1. 依赖注入是具有传染性的。如果一个类的对象是通过DI来进行创建的,那么这个类的构造函数中声明的所有服务类型参数都会被DI自动赋值。而如果一个类是程序员手动创建的,那么该类就和DI没有关系,构造函数中声明的服务类型参数不会自动赋值。
  2. .NET的DI默认是构造函数注入。

实例代码:

using Microsoft.Extensions.DependencyInjection;
using System.Runtime.InteropServices;

namespace _2_28.NET依赖注入
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection serviceDescriptors = new ServiceCollection();
            serviceDescriptors.AddScoped<Controller>();
            serviceDescriptors.AddScoped<ILog, Log>();
            serviceDescriptors.AddScoped<ICloud, Cloud>();
            serviceDescriptors.AddScoped<IConfig, Config>();
            using (var sp = serviceDescriptors.BuildServiceProvider())
            {
                var result = sp.GetService<Controller>();
                result.Test();
            }
        }
    }

    class Controller
    {
        private readonly ILog log;
        private readonly ICloud cloud;

        public Controller(ILog log,ICloud cloud)
        {
            this.log = log;
            this.cloud = cloud;
        }

        public void Test()
        {
            log.Log("上传...");
            this.cloud.Save("1.txt", "DI Test");
            log.Log("上传完成...");
        }
    }

    interface ILog
    {
        public void Log(string msg);
    }

    class Log : ILog
    {
        void ILog.Log(string msg)
        {
            Console.WriteLine($"Log : {msg}");
        }
    }

    interface IConfig
    {
        public string GetValue(string name);
    }

    class Config : IConfig
    {
        public string GetValue(string name)
        {
            return "e:/a/"+name; 
        }
    }


    interface ICloud
    {
        public void Save(string content,string name);
    }

    class Cloud : ICloud
    {
        private readonly IConfig config;
        public Cloud(IConfig config)
        {
            this.config = config;
        }
        public void Save(string fName, string content)
        {
            File.WriteAllTextAsync(config.GetValue(fName), content);
        }
    }
}

通过分步调试之后,可以观察到在Cloud类,Controller类中的构造函数中的服务参数都被DI自动赋值了。


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