浪浪山管理系统开发---依赖注入
我们要举得例子呢是一个分页查询的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包含以下几个关键部分:
 
- Configuration:用于读取应用程序的配置文件(如appsettings.json)和环境变量。
 - Logging:用于配置应用程序的日志记录。
 - Services:用于注册依赖注入容器中的服务。
 - Host:用于配置应用程序的主机。
 
- WebApplicationBuilder的工作原理
 
- 创建构建器:WebApplication.CreateBuilder(args)方法创建一个WebApplicationBuilder实例。这个实例包含了默认的配置、日志记录和服务注册。
 - 配置服务:通过builder.Services,您可以将各种服务注册到依赖注入容器中。这些服务可以在应用程序的各个部分使用。
 - 配置中间件:通过builder,您可以配置中间件管道。中间件是处理HTTP请求和响应的组件,它们按顺序执行。
 - 构建应用程序:调用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(控制器)的作用
 
- 处理请求:控制器接收并处理来自客户端的HTTP请求。
 - 调用业务逻辑:控制器通常会调用服务层或业务逻辑层来处理请求。
 - 返回响应:控制器将处理结果封装成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
            });
        }
这里的返回结果是这样的:
以上就是我们进行依赖注入的全过程了,是不是很有意思呢??


                





                            
                        
                            
                        






这一切,似未曾拥有