• ASP.NET Core 2.0系列学习笔记-DI依赖注入


    依赖注入(Dependency Injection):当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。而依赖注入的方式,创建被调用者的工作不再由调用者来完成,因此叫做控制反转,创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称作依赖注入。

    )控制反转(IoC/Inverse Of Control):   调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。
    )依赖注入(DI/Dependence injection) :   容器创建好实例后再注入调用者称为依赖注入。
    1、Startup类能够选择性地在构造函数中接受通过依赖注入提供的依赖项。Startup类必须定义一个Configure方法,可选择定义一个ConfigureServices方法,这些方法将在应用程序启动时被调用。

    2、Configure方法用于指定ASP.NET应用程序将如何响应每一个HTTP请求。

    注入服务Services:

    AddTransient:每次调用范围,瞬态;

    AddScoped:单次请求范围内,域内;

    AddSingletion:整个应用范围,单例;

    应用:

    一、通过构造函数使用接口;

    1.自定义接口服务:

    /// <summary>
    /// 定义一个接口
    /// </summary>
    public interface IABC
    {
        void SayHi();
    }
    
    /// <summary>
    /// 定义一个类 继承 IABC接口
    /// </summary>
    public class ABC : IABC
    {
        public void SayHi()
        {
            Console.WriteLine("Hello, .NET Core");
        }
    }    

    2.注入自定义服务:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IABC, ABC>(); //注入自定义服务
        services.AddMvc(); //添加MVC服务
    }

    3.MVC控制器Controller构造函数中入住:

    public class HomeController : Controller
    {
        IABC _abc; //自定义接口
        public HomeController(IABC abc)
        {
            _abc = abc; //构造函数注入
        }    
    
        public IActionResult Index()
        {
            _abc.SayHi(); //调用
            return View();
        }
    }        

    思考:假如在定义一个类继承上面自定义的接口IABC,并实现接口中的方法SayHi(),依次出入服务时,会有什么样的结果呢?

    ///继承IABC并实现SayHi()
    public class BCD : IABC
    {
        public void SayHi()
        {
            Console.WriteLine("Hello,BCD");
        }
    }    

    依次在ConfigureServices()方法中注入服务:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IABC, ABC>(); //注入自定义服务ABC
        services.AddScoped<IABC, BCD>(); //注入自定义服务BCD
        services.AddMvc(); //添加MVC服务
    }

    结果:在MVC的Action方法Index中执行,会覆盖ABC中的内容,最终输出:Hello,BCD(备注:将SayHi方法void修改为string返回出值,定义变量接收,vs即时窗口中监视,此处为做修改,只做调试演示。)

     思考:ABC和BCD都同是继承IABC接口,但ABC和BCD中的SayHi方法执行的内容不一致,如果就要执行指定类中的方法,该怎么修改呢?修改如下:

    public void ConfigureServices(IServiceCollection services)
    {
        //services.AddScoped<IABC, ABC>(); //注入自定义服务ABC
        services.AddScoped(typeof(ABC)); //调整后,注意同上对比
        //var abc = Activator.CreateInstance(typeof(ABC)) as ABC;
    
        services.AddScoped<IABC, BCD>(); //注入自定义服务BCD
        services.AddMvc(); //添加MVC服务
    }
    public class HomeController : Controller
    {
        IABC _abc; 
        public HomeController(ABC abc)
        {
            _abc = abc;
        }
    
        public IActionResult Index()
        {
            _abc.SayHi();
            return View();
        }
    }    

     

     二、MVC的Action中可以用[FromServices]来注入放的对象;

    public IActionResult About([FromServices] ABC abc) 
    {
        abc.SayHi();
        ViewData["Message"] = "Your application description page.";
        return View();
    }

    当单个Action方法使用时,可以不用在整个Controller的构造函数中注入服务,减少HTTP请求(访问)生命周期。

  • 相关阅读:
    python numpty 中shape的用法
    卷积神经网络中参数的计算
    linux学习
    数据结构排序算法总结
    剑指offer 刷题 01
    30-大道至简——随机森林如何将分类器由弱变强
    29-用python构造一棵决策树
    28-决策树算法——简单有效的概率模型
    27-如何度量分类算法的性能好坏(Scoring metrics for classification)
    26-史上最简单的分类算法——KNN
  • 原文地址:https://www.cnblogs.com/kevin860/p/12619192.html
Copyright © 2020-2023  润新知