浪浪山管理系统开发---依赖注入

我们要举得例子呢是一个分页查询的API

话不多说,我们先看效果图:

浪浪山管理系统开发---依赖注入

浪浪山管理系统开发---依赖注入

看完效果图了,那么大概我们要实现一个什么功能,大家就心里有数了吧?那话不多说,我们进入Code TIme

在Program.cs中注册服务

首先我们进入Program.cs文件,这个文件你可以理解成是项目的入口点,在C语言中我们的程序都是从main函数开始的,同理在C#中main函数就隐藏在这个文件里面。也就是说我们点击运行程序的时候他首先会从Program.cs文件中进入。

既然知道我们的Program.cs是干啥的之后我们先来看看代码吧!!

using langlangshanWebAPI.Utility.SwaggerExt;
using Microsoft.OpenApi.Models;
using SqlSugar;
using System.Reflection;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

#region IOC

builder.Services.AddTransient<SqlSugarClient>(serverprivider =>
{
    ConnectionConfig connection = new ConnectionConfig()
    {
        ConnectionString = builder.Configuration.GetConnectionString("Default"),
        DbType = DbType.SqlServer,//提交数据库的类型
        IsAutoCloseConnection = true,//自动关闭连接
        InitKeyType = InitKeyType.Attribute,//从特性读取主键自增列信息
    };

    return new SqlSugarClient(connection);
}
);

#endregion

上面的代码就是我们的核心代码部分,当前我们的例子是实现我们分页管理api的,所以我删减了部分Program.cs文件中的内容,保留了最核心的代码,下面我将逐步解析一下整个过程。

我们得从builder开始讲起,否则整个代码将不太好理解,我们先来介绍一下builder吧

  • builder是ASP.NET Core 6.0+中的一个新概念,它是WebApplicationBuilder类的一个实例。WebApplicationBuilder简化了应用程序的启动和配置过程。

  • WebApplicationBuilder包含以下几个关键部分:

  1. Configuration:用于读取应用程序的配置文件(如appsettings.json)和环境变量。
  2. Logging:用于配置应用程序的日志记录。
  3. Services:用于注册依赖注入容器中的服务。
  4. Host:用于配置应用程序的主机。
  • WebApplicationBuilder的工作原理
  1. 创建构建器:WebApplication.CreateBuilder(args)方法创建一个WebApplicationBuilder实例。这个实例包含了默认的配置、日志记录和服务注册。
  2. 配置服务:通过builder.Services,您可以将各种服务注册到依赖注入容器中。这些服务可以在应用程序的各个部分使用。
  3. 配置中间件:通过builder,您可以配置中间件管道。中间件是处理HTTP请求和响应的组件,它们按顺序执行。
  4. 构建应用程序:调用builder.Build()方法构建一个WebApplication实例。这个实例代表整个应用程序,并包含所有已注册的服务和中间件配置。

简单理解就是builder就代表了整个应用,其内部有configuration方法来配置项目所需文件,也有Services方法来进行依赖注入。明白这点之后一切都会变的好理解起来。

那回到我们的代码,知道了builder是什么你就应该就能明白我们代码部分在干啥了吧,看到那个Services方法没,没错!!他就是在注册依赖注入容器中的服务。

builder.Services.AddTransient<SqlSugarClient>(serverprivider =>
{
    ConnectionConfig connection = new ConnectionConfig()
    {
        ConnectionString = builder.Configuration.GetConnectionString("Default"),
        DbType = DbType.SqlServer,//提交数据库的类型
        IsAutoCloseConnection = true,//自动关闭连接
        InitKeyType = InitKeyType.Attribute,//从特性读取主键自增列信息
    };

    return new SqlSugarClient(connection);
}
);

而其中的ConnectionConfig connection = new ConnectionConfig()代码则是在连接我们的数据库,设置我们的数据库类型

 ConnectionConfig connection = new ConnectionConfig()
    {
        ConnectionString = builder.Configuration.GetConnectionString("Default"),
        DbType = DbType.SqlServer,//提交数据库的类型
        IsAutoCloseConnection = true,//自动关闭连接
        InitKeyType = InitKeyType.Attribute,//从特性读取主键自增列信息
    };

按照往常的经验,连接数据库我们是需要数据库的信息的,比如数据库的用户名和密码等等信息,这个部分去哪了呢???在以上代码中这部分被我们设置在了appsettings.json文件中,那appsettings.json是什么呢??这个文件也是和Program.cs一样,也是.NET自带的文件,以下是它的介绍:

  • appsettings.json是ASP.NET Core项目中的一个配置文件,用于存储应用程序的配置信息。它通常包含数据库连接字符串、应用程序设置、日志配置等。这个文件使用JSON格式,易于阅读和编辑。

浪浪山管理系统开发---依赖注入

是的,整个字符串连接信息全部存入了变量Default中,我们在Program.cs中调用它就好了,这就是我们上面代码的ConnectionString的调用部分:

        ConnectionString = builder.Configuration.GetConnectionString("Default"),

到这里我们的服务注册部分就完成了,注册完成了,那我们总得调用它吧?接下来我们将来调用它。

让我们来到SystemLogController.cs,在此之前我们也要介绍一下Controller(控制器)。

在Controller类中实现调用

  • Controller(控制器)的作用
  1. 处理请求:控制器接收并处理来自客户端的HTTP请求。
  2. 调用业务逻辑:控制器通常会调用服务层或业务逻辑层来处理请求。
  3. 返回响应:控制器将处理结果封装成HTTP响应返回给客户端。

千言万语,浓缩成一句话,控制器就是在接受或者发送Http请求,比如用户在网页要查询某一页的内容,那我程序是不是要调用数据库???那好,既然要调用数据我们就得发送get请求,去从数据库里面把要的数据传到用户页面。那我们的控制器就是这样作用,他就是替我们把查询请求发送给数据库命令的嘴替!!

明白了控制器的作用,我们对代码的理解就会好很多,接下来我们来分析一下代码:

using langlangshan.SmartFactory.Enitity.EnitityMap;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;

namespace langlangshanWebAPI.Controllers
{
    /// <summary>
    /// 系统日志管理
    /// </summary>
    [ApiController]
    [Route("[controller]")]
    public class SystemLogController : ControllerBase
    {
        private readonly ILogger<SystemLogController> _logger;
        private readonly SqlSugarClient _SqlSugarClient;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="logger"></param>

        public SystemLogController(ILogger<SystemLogController> logger,SqlSugarClient sqlSugarClient)
        {
            _logger = logger;
            _SqlSugarClient = sqlSugarClient;

        }
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="pageindex">当前第几页</param>
        /// <param name="pageSize">每一页的数量</param>
        /// <returns></returns>
        /// 
        [HttpGet("{pageindex:int}/{pageSize:int}")]
         public IActionResult SystemLogPage(int pageindex,int pageSize)
        {
            int totalcount = 0;
           // SqlSugarClient sqlSugarClient = new SqlSugarClient(connection);
            List <SystemLog>  pagerList=_SqlSugarClient.Queryable <SystemLog>().ToPageList(pageindex, pageSize,
               ref totalcount  );

            return new JsonResult(new
            {
                Data= pagerList,
                TotalCount = totalcount
            });
        }

    }
}

以上呢就是我们SystemLogController.cs里面的完整代码。我们来讲一下这部分代码的作用。

首先映入我们眼前的是我们控制器的构造函数:

        public SystemLogController(ILogger<SystemLogController> logger,SqlSugarClient sqlSugarClient)
        {
            _logger = logger;
            _SqlSugarClient = sqlSugarClient;

        }

(ps:不知道构造函数的自己去Google一下,这个太基础了,就不讲了)。这个构造函数定义了我们需要的参数,一个是我们的SqlSugerClient参数。然后我们把这个参数传递给我们在当前SystemLogController.cs定义的变量_SqlSugarClient。这个是一个什么过程呢?这个过程是这样的,当你启动项目的时候,程序在Program.cs中注册了相应的服务,然后此时我们调用SystemLogController.cs中的方法的时候首先就会去查看构造函数,程序发现构造函数需要SqlSugerClient,那就直接把我们在Program.cs的注册的SqlSugerClient实例传给了控制器类中的_SqlSugarClient,此时Program.cs创建的实例就传递到了我们控制器类中来了,以便我们可以完成后续的操作。我们后续的操作就是查询嘛,于是我们下面这段代码就在实现查询,然后返回查询到的数据。

        [HttpGet("{pageindex:int}/{pageSize:int}")]
         public IActionResult SystemLogPage(int pageindex,int pageSize)
        {
            int totalcount = 0;
           // SqlSugarClient sqlSugarClient = new SqlSugarClient(connection);
            List <SystemLog>  pagerList=_SqlSugarClient.Queryable <SystemLog>().ToPageList(pageindex, pageSize,        //将查询到的数据保存为列表形式
               ref totalcount  ); //

            return new JsonResult(new
            {
                Data= pagerList,
                TotalCount = totalcount
            });
        }

这里的返回结果是这样的:
浪浪山管理系统开发---依赖注入

以上就是我们进行依赖注入的全过程了,是不是很有意思呢??