文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

.NET学习笔记之默认依赖注入

2024-04-02 19:55

关注

介绍

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

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

生命周期

AddSingleton→AddTransient→AddScoped

Singleton(单例)

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


services.AddSingleton<IApplicationService,ApplicationService>

比如某些公共类等

Scoped(作用域)

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


services.AddScoped<IApplicationService,ApplicationService>

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

Transient(瞬时)

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


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。


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>();

总结

到此这篇关于.NET学习笔记之默认依赖注入的文章就介绍到这了,更多相关.NET默认依赖注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯