• .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();  //成功返回
            }
    
  • 相关阅读:
    typescript学习记录-联合类型(14)
    typescript学习记录-元组(13)
    typescript学习记录-Map(对象)(12)
    typescript学习记录-Array(数组)(11)
    typescript学习记录-String(10)
    typescript学习记录-Number(9)
    typescript学习记录-函数(8)重点重点
    typescript学习记录-循环(7)
    SQL注入基础知识及绕过方式
    暴力破解攻击方式及思路
  • 原文地址:https://www.cnblogs.com/Alex-Mercer/p/13202873.html
Copyright © 2020-2023  润新知