zoukankan      html  css  js  c++  java
  • .NET之默认依赖注入

    介绍

    不要依赖于具体的实现,应该依赖于抽象,高层模块不应该依赖于底层模块,二者应该依赖于抽象。简单的说就是为了更好的解耦。而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖注入(DI)。ASP.NET Core内置有对依赖注入(DI)的支持,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可。

    只要是用new实例化的都是存在依赖的。

    生命周期

    AddSingleton→AddTransient→AddScoped

    Singleton(单例)

    服务在第一次请求时被创建(或者当我们在ConfigureServices中指定创建某一实例并运行方法),其后的每次请求将沿用已创建服务。如果开发者的应用需要单例服务情景,请设计成允许服务容器来对服务生命周期进行操作,而不是手动实现单例设计模式然后由开发者在自定义类中进行操作。

    image

    图片来源自:https://blog.csdn.net/weixin_47498376/article/details/116177389

    services.AddSingleton<IApplicationService,ApplicationService>
    

    比如某些公共类等

    Scoped(作用域)

    一次请求开始到请求结束 ,这次请求中获取的对象都是同一个

    image

    图片来源自:https://blog.csdn.net/weixin_47498376/article/details/116177389

    services.AddScoped<IApplicationService,ApplicationService>
    

    如果该service在一个请求过程中多次被用到,并且可能共享其中的字段或者属性,那么就使用scoped,例如httpcontext (感谢群里老哥的帮助)

    Transient(瞬时)

    每一次获取的对象都不是同一个,它最好被用于轻量级无状态服务(如我们的Repository和ApplicationService服务)

    image

    图片来源自:https://blog.csdn.net/weixin_47498376/article/details/116177389

    services.AddTransient<IApplicationService,ApplicationService>
    

    如果该service在一次请求中只使用一次,那么就注册Transient就好了。

    注入方式

        /// <summary>
        /// 用户接口
        /// </summary>
        public interface IUserService
        {
            string GetName();
        }
    
        /// <summary>
        /// 用户实现
        /// </summary>
        public class UserService : IUserService
        {
            public string GetName()
            {
                return "AZRNG";
            }
        }
    

    需要在ConfigureServices方法进行注入

    构造函数注入

    服务作为构造函数参数添加,并且运行时从服务容器中解析服务。

            private readonly IUserService _userService;
    
            public UserController(IUserService userService)
            {
                _userService = userService;
            }
    
            [HttpGet]
            public ActionResult GetName()
            {
                return Ok(_userService.GetName());
            }
    

    FromServices操作注入

            [HttpGet]
            public ActionResult GetName([FromServices] IUserService _userService)
            {
                return Ok(_userService.GetName());
            }
    

    核心

    在.NET Core中DI的核心分为两个组件:IServiceCollection和 IServiceProvider。

    • IServiceCollection负责注册
    • IServiceProvider负责提供实例
    public void ConfigureServices(IServiceCollection services)
    {
        //将服务生命期的范围限定为单个请求的生命期
        services.AddTransient<IUserService, UserService>();
    }
    

    获取服务

            private readonly IUserService _userService;
            public HomeController(IUserService userService)
            {
                _userService = userService;
            }
    
            public IActionResult Index()
            {
                var info = _userService.GetInfo();
                return View();
            }
    

    IServiceProvider获取

            private readonly IServiceProvider _service;
            public UserController(IServiceProvider service)
            {
                _service = service;
            }
    
            [HttpGet]
            public ActionResult GetName()
            {
                var _userService = (IUserService)_service.GetService(typeof(IUserService));
                return Ok(_userService.GetName());
            }
    

    statrup中获取服务

    var provider = services.BuildServiceProvider();
    var userserivce = provider.GetService<IUserService>();
    //或
    var userservice2 = provider.GetRequiredService<IUserService>();
    

    微信公众号

  • 相关阅读:
    RocketMQ源码分析:(二)消息发送的三种方式
    LTS本地搭建详述
    Mac端解决(含修改8.0.13版的密码):Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
    flink入门:01 构建简单运行程序
    rocketmq控制台搭建(rocketmq-console)
    在consul上注册web服务
    将filenames里的每个字符串输出到out文件对象中注意行首的缩进
    spidermark sensepostdata ntp_monlist.py
    HTTP Error 403没有了,但是中文全都是乱码。又是怎么回事?
    original.txt和提交的页面输出的文字的混合文件
  • 原文地址:https://www.cnblogs.com/azrng/p/14743716.html
Copyright © 2011-2022 走看看