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

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

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

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

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

如何注入自己的服务

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

  • Transient(瞬时的)

    每次请求时都会创建的瞬时生命周期服务。这个生命周期最适合轻量级,无状态的服务。
  • Scoped(作用域的)

    创建的对象在同一个请求会话时是相同的,每一个不同的会话创建一个不同的实例。
  • Singleton(唯一的)

    创建的对象在所有的地方所有的请求会话创建的都是不同的。

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

services.AddTransient<ITestService, TestService>();
services.AddScoped<ITestService, TestService>();
services.AddSingleton<ITestService, TestService>();

编写服务

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

  1. 首先定义接口,IInfluxDbService.cs,接口里面我只写了两个接口。
public interface IInfluxDbService
{
void AddData(string tableName,
Dictionary<string, object> tags,
Dictionary<string, object> fields, DateTime timestamp); IList<IList<object>> 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);
}
/// <summary>
/// 增加数据
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="tags">索引</param>
/// <param name="fields">字段</param>
/// <param name="timestamp">时间戳</param>
public async void AddData(string tableName,
Dictionary<string,object> tags,
Dictionary<string,object> 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);
} /// <summary>
/// 查询数据
/// </summary>
/// <param name="queries"></param>
/// <returns>返回查询结果</returns>
public IList<IList<object>> 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<IInfluxDbService, InfluxDbService>(a => new InfluxDbService(url, dbName, userName, password));
//以下是系统自动生成
services.AddControllersWithViews();
services.AddMvcCore().AddApiExplorer();
}

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

封装扩展服务

  1. 首先新建一个ServiceExtensions的静态类
    /// <summary>
/// 服务扩展类
/// </summary>
public static class ServiceExtensions
{
/// <summary>
/// 添加跨域
/// </summary>
/// <param name="services"></param>
public static void ConfigureCors(this IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowAny", builder => builder.SetIsOriginAllowed(isOriginAllowed: _ => true)
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
} /// <summary>
/// 注入InfluxDb服务
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
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<IInfluxDbService, InfluxDbService>(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容器)的更多相关文章

  1. Asp.net Core依赖注入(Autofac替换IOC容器)

    ASP.NET Core ASP.NET Core (previously ASP.NET 5) 改变了以前依赖注入框架集成进ASP.NET的方法. 以前, 每个功能 - MVC, Web API, ...

  2. ASP.NET Core依赖注入系统学习教程:容器对构造函数选择的策略

    .NET Core的依赖注入容器之所以能够为应用程序提供服务实例,这都归功于ServiceDescriptor对象提供的服务注册信息.另外,在ServiceDescriptor对象中,还为容器准备了3 ...

  3. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  4. ASP.NET Core 依赖注入最佳实践——提示与技巧

    在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...

  5. ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】

    ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...

  6. ASP.NET Core 依赖注入(构造函数注入,属性注入等)

    原文:ASP.NET Core 依赖注入(构造函数注入,属性注入等) 如果你不熟悉ASP.NET Core依赖注入,先阅读文章: 在ASP.NET Core中使用依赖注入   构造函数注入 构造函数注 ...

  7. ASP.NET Core 依赖注入最佳实践与技巧

    ASP.NET Core 依赖注入最佳实践与技巧 原文地址:https://medium.com/volosoft/asp-net-core-dependency-injection-best-pra ...

  8. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  9. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  10. asp.net core 依赖注入几种常见情况

    先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...

随机推荐

  1. ssh-copy-id to filter out any that...ERROR: Read from socket failed: Connection reset by peer

    ssh-copy-id bigboss1 /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter ...

  2. Java实现 蓝桥杯 算法训练 找零钱

    试题 算法训练 找零钱 问题描述 有n个人正在饭堂排队买海北鸡饭.每份海北鸡饭要25元.奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25.50.100元),而且饭堂阿姨一开始没有任何零钱.请问饭 ...

  3. Java实现 LeetCode 729 我的日程安排表 I(二叉树)

    729. 我的日程安排表 I 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安排. MyCalendar 有一个 book(int sta ...

  4. Java实现 蓝桥杯VIP 算法训练 数的划分

    [题目描述] 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5: 1,5,1: 5,1,1: 问有多少种不同的分法. ...

  5. Java实现 蓝桥杯 算法训练 数字三角形

    算法训练 数字三角形 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每 ...

  6. Java实现 LeetCode 479 最大回文数乘积

    479. 最大回文数乘积 你需要找到由两个 n 位数的乘积组成的最大回文数. 由于结果会很大,你只需返回最大回文数 mod 1337得到的结果. 示例: 输入: 2 输出: 987 解释: 99 x ...

  7. Java实现 LeetCode 327 区间和的个数

    327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...

  8. 第八届蓝桥杯JavaC组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.数位和 题目描述 数学家高斯很小的时候就天分过人.一次老师指定的算数题目是:1+2+-+100. 高斯立即做出答案:5050! 这次你 ...

  9. java实现第二届蓝桥杯连通问题(C++)

    连通问题. BMP是常见的图像存储格式. 如果用来存黑白图像(颜色深度=1),则其信息比较容易读取. 与之相关的数据: (以下偏移均是从文件头开始) 偏移:10字节, 长度4字节: 图像数据真正开始的 ...

  10. Mybatis基本入门搭建

    一:Mybatis框架概述 1:什么是Mybatis 官方定义: MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以 ...