.Net Core 依赖注入

参考链接

依赖注入概述

在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S)、开放封闭原则(O)、里氏替换原则(L)、接口分离原则(I)、依赖反转原则(D)。本篇介绍依赖反转原则以及在
ASP.NET Core中的实现。

直接依赖是指:当一个类需要另一个类协作来完成工作的时候就产生了依赖。举例比如:模块 A 调用模块 B 中的函数,而模块 B 又调用模块 C 中的函数,则编译时 A 取决于 B,而 B 又取决于 C。这是有严重的依赖关系,不属于松散耦合。

依赖反转是指:高层模块不应该依赖低层模块,二者都应该依赖于抽象,是对接口而不是实现编程。当一个类(Class)需要被外部依赖,就需要把它抽象成一个接口(interface),如何把这个接口变成具体可调用的实例,就是由依赖注入来完成。依赖反转是生成松散耦合应用程序的关键一环。当应用依赖反转原则后,A 可以调用 B 实现的抽象上的方法,让 A 可以在运行时调用 B,而 B 又在编译时依赖于 A 控制的接口。 运行时程序执行的流程保持不变,但接口引入意味着可以轻松插入这些接口的不同实现。

为什么要使用依赖注入

(1)原始社会里,没有社会分工。须要斧子的人(调用者)仅仅能自己去磨一把斧子(被调用者)。相应的情形为:软件程序里的调用者自己创建被调用者。

(2)进入工业社会,工厂出现。斧子不再由普通人完毕,而在工厂里被生产出来,此时须要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。相应软件程序的简单工厂的设计模式。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:须要斧子。斧子就自然出如今他面前。相应Spring的依赖注入。

小demo

1.接口和对应的实现类

   public interface ITestSayHello
    {
        string Hello();
    }
    public class Test : ITestSayHello
    {
        public string Hello()
        {
            return "Hello";
        }
    }

2.Nuget引入Autofac

3.修改Program.cs,添加有注释的那一行代码

  public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())//需要在 Program.cs 中的 CreateHostBuilder 中,添加Autofac的服务工厂:
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

4.Startup中修改

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddControllersAsServices(); //增加 .AddControllersAsServices()
            services.AddTransient<ITestSayHello, Test>(); //具体生命周期的再研究吧。
        }

  public void ConfigureContainer(ContainerBuilder builder)
        {
            builder.RegisterType<Test>();//注册服务,接口不行
        }

5.控制器构造函数

    readonly ITestSayHello _test;
    public WeatherForecastController(ITestSayHello test)
        {
            _test = test;
        }

    [HttpGet]
    public async Task<dynamic> Get()
        {
            return _test.Hello();  //成功返回
        }
posted @ 2020-06-28 15:05  Alex_Mercer  阅读(213)  评论(0编辑  收藏  举报