热门标签 | 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容器)


推荐阅读
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 本文介绍了一个使用Spring框架和Quartz调度器实现每周定时调用Web服务获取数据的小项目。通过详细配置Spring XML文件,展示了如何设置定时任务以及解决可能遇到的自动注入问题。 ... [详细]
  • 本文介绍如何通过参数化查询来防止SQL注入攻击,确保数据库的安全性。示例代码展示了在C#中使用参数化查询添加学生信息的方法。 ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 作为一名新手开发者,我正在尝试使用 ASP.NET 和 Vue.js 构建一个单页面应用,涉及多个复杂组件(如按钮、图表等)。希望有经验的开发者能够提供指导。 ... [详细]
  • 深入理解Java多线程与并发机制
    本文探讨了Java多线程和并发机制的核心概念,包括多线程类的分类、执行器框架、并发容器及控制工具。通过详细解析这些组件,帮助开发者更好地理解和应用多线程技术。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文介绍了 Python 中的基本数据类型,包括不可变数据类型(数字、字符串、元组)和可变数据类型(列表、字典、集合),并详细解释了每种数据类型的使用方法和常见操作。 ... [详细]
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社区 版权所有