热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

asp.netCore依赖注入(自带的IOC容器)

今天我们主要讲讲如何使用自带IOC容器,虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库.在新的ASP.NETCore中,大量的采用了依赖注入的方式来编写代码.

今天我们主要讲讲如何使用自带IOC容器,虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库.

在新的ASP.NET Core中,大量的采用了依赖注入的方式来编写代码.

比如,在我们的Startup类中的ConfigureServices里,就可以看到:

AddMvc AddDbContext 包括我们之前目录游览用到的AddDirectoryBrowser..

都是框架提供好的服务,我们直接注入就可以使用了.

如何注入自己的服务

目前有三种注入,各有不同:

  • Transient(瞬时的)
    每次请求时都会创建的瞬时生命周期服务。这个生命周期最适合轻量级,无状态的服务。
  • Scoped(作用域的)
    创建的对象在同一个请求会话时是相同的,每一个不同的会话创建一个不同的实例。
  • Singleton(唯一的)
    创建的对象在所有的地方所有的请求会话创建的都是不同的。

如何使用这三种生命周期呢?.我们直接在注入的时候用不同的方法就行了,代码如下:

services.AddTransient();
services.AddScoped();
services.AddSingleton();

编写服务

我这里写了一个查询InfluxDb的服务,就用这个作为例子来分析。

  1. 首先定义接口,IInfluxDbService.cs,接口里面我只写了两个接口。
public interface IInfluxDbService
{
    void AddData(string tableName,
        Dictionary tags,
        Dictionary fields, DateTime timestamp);

    IList GetData(string queries);
}
  1. 编写服务,继承自接口,InfluxDbService.cs
    可以看到带了一个含参构造函数,传入数据库地址及用户密码等必须信息。
    public class InfluxDbService:IInfluxDbService
    {
        //声明InfluxDbClient
        private InfluxDbClient clientDb;
        private string dbName;

        public InfluxDbService(string infuxUrl, string dbName,string infuxUser, string infuxPwd)
        {
            this.dbName = dbName;
            clientDb = new InfluxDbClient(infuxUrl, infuxUser, infuxPwd, InfluxDbVersion.Latest);
        }
        /// 
        /// 增加数据
        /// 
        /// 表名
        /// 索引
        /// 字段
        /// 时间戳
        public async void AddData(string tableName,
            Dictionary tags,
            Dictionary fields,DateTime timestamp)
        {
            //基于InfluxData.Net.InfluxDb.Models.Point实体准备数据
            var pointModel = new Point();
            pointModel.Name = tableName;
            pointModel.Tags = tags;
            pointModel.Fields = fields;
            pointModel.Timestamp = timestamp;
           
            //从指定库中写入数据,支持传入多个对象的集合
            var respOnse= await clientDb.Client.WriteAsync(pointModel, this.dbName);
        }

        /// 
        /// 查询数据
        /// 
        /// 
        /// 返回查询结果
        public IList GetData(string queries)
        {
            //从指定库中查询数据
            var respOnse=  clientDb.Client.QueryAsync(queries, this.dbName);
            //得到Serie集合对象(返回执行多个查询的结果)
            var series = response.Result.ToList();
            var list = series[0].Values;
            return list;
        }
    }

这样我们的服务就写完了,接下来就是如何注入服务。

依赖注入

我们可以在Startup类中直接注入,比如,我这里就拿AddSingleton作为示例进行演示。

public void ConfigureServices(IServiceCollection services)
{
    //读配置文件获取参数
    var url = configuration.GetValue("InfluxDb:ConnectionString", "http://127.0.0.1:8086");
    var dbName = configuration.GetValue("InfluxDb:DatabaseName", "autocontrol");
    var userName = configuration.GetValue("InfluxDb:UserName", "admin");
    var password = configuration.GetValue("InfluxDb:Password", "admin");
    //注入依赖
    services.AddSingleton(a => new InfluxDbService(url, dbName, userName, password));
    //以下是系统自动生成
    services.AddControllersWithViews();
    services.AddMvcCore().AddApiExplorer();
}

只因我这里加入了很多参数,代码就有一大坨了,如果所有服务都这样写,可以想象下,如果服务很多,那么这个方法就会越来越长,后期很难维护,代码看起来也不优雅美观,为了减少ConfigureServices这个函数体的长度,我们可以把这一段封装起来。

封装扩展服务

  1. 首先新建一个ServiceExtensions的静态类
    /// 
    /// 服务扩展类
    /// 
    public static class ServiceExtensions
    {
        /// 
        /// 添加跨域
        /// 
        /// 
        public static void ConfigureCors(this IServiceCollection services)
        {
            services.AddCors(optiOns=>
            {
                options.AddPolicy("AllowAny", builder => builder.SetIsOriginAllowed(isOriginAllowed: _ => true)
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            });
        }

        /// 
        /// 注入InfluxDb服务
        /// 
        /// 
        /// 
        public static void AddInfluxDbService(this IServiceCollection services, IConfiguration configuration)
        {
            //服务DI注入
            var url = configuration.GetValue("InfluxDb:ConnectionString", "http://127.0.0.1:8086");
            var dbName = configuration.GetValue("InfluxDb:DatabaseName", "autocontrol");
            var userName = configuration.GetValue("InfluxDb:UserName", "admin");
            var password = configuration.GetValue("InfluxDb:Password", "admin");

            services.AddSingleton(a => new InfluxDbService(url, dbName, userName, password));

        }
    }

我这里封装了两个服务。

  • ConfigureCors:跨域的服务
  • AddInfluxDbService:InfluxDb的服务
public void ConfigureServices(IServiceCollection services)
{
    //设置跨域处理
    services.ConfigureCors();
    //注入服务
    services.AddInfluxDbService(Configuration);

    services.AddControllersWithViews();
            
    services.AddMvcCore().AddApiExplorer();
}

这样就相当简洁了,哈哈

控制器

修改控制器代码如下

    private IInfluxDbService _influxDbService;
    public CurrentStatusController(IInfluxDbService influxDbService)
    {
        _influxDbService = influxDbService;
    }

这样就控制器就可以使用_influxDbService来操作数据库了

asp.net Core依赖注入(自带的IOC容器)


推荐阅读
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本文介绍如何在SQL Server中对Name列进行排序,使特定值(如Default Deliverable Submission Notification)显示在结果集的顶部。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入解析Spring Boot自动配置机制
    本文旨在深入探讨Spring Boot的自动配置机制,特别是如何利用配置文件进行有效的设置。通过实例分析,如Http编码自动配置,我们将揭示配置项的具体作用及其背后的实现逻辑。 ... [详细]
  • Asp.net MVC 中 Bundle 配置详解:合并与压缩 JS 和 CSS 文件
    本文深入探讨了 Asp.net MVC 中如何利用 Bundle 功能来合并和压缩 JavaScript 和 CSS 文件,提供了详细的配置步骤和示例代码,适合开发人员参考学习。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 掌握Spring MVC中自定义类型转换与格式化的技巧
    近期,在开发一款小程序的过程中遇到了几个Spring MVC接口需要传递时间参数的问题。本文将详细介绍如何利用Java 8 Time API在Spring MVC中实现时间参数的自定义类型转换和格式化。 ... [详细]
author-avatar
左莹薇_834
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有