.Net Core 6 WebApi 项目搭建(二)

news2024/11/30 2:24:23

书接上文,上文写了个简单的.net core api程序创建流程,今天来写一下简单项目搭建步骤。

一.Autofac反射程序集方式服务注册

我们这里还是使用Autofac容器,具体使用教程可参考文章《.NET Core基础知识-依赖注入(Autofac)》这篇文章介绍的比较详细了。下面我说一下在.net core6里是怎么创建注入的。

1、Autofac在.net core6里依赖注入

1.1 先导入包

在这里插入图片描述

1.2 在Program中反射程序集方式服务注册Autofac
#region Autofac程序集注入
//添加Autofac容器
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());



//builder.Host.ConfigureContainer<ContainerBuilder>(container => { container.RegisterType<LoginServices>().As<ILoginServices>(); });
//builder.Host.ConfigureContainer<ContainerBuilder>(container => { container.RegisterType<LoginRepositorys>().As<ILoginRepositorys>(); });
//.net core6 Autofac程序集扫描注入
Assembly service = Assembly.Load("Services");
Assembly repository = Assembly.Load("Repositorys");
builder.Host.ConfigureContainer<ContainerBuilder>(container =>
{
    container.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Services"))
          .AsImplementedInterfaces();
});
builder.Host.ConfigureContainer<ContainerBuilder>(container =>
{
    container.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Repositorys"))
    .AsImplementedInterfaces();
});
//早期.net core Autofac程序集扫描注入
//public void ConfigureContainer(ContainerBuilder builder)
//{
//    Assembly service = Assembly.Load("Services");
//    Assembly repository = Assembly.Load("Repository");
//    //containerBuilder.RegisterAssemblyTypes(service).AsImplementedInterfaces().InstancePerDependency();
//    builder.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Service"))
//          .AsImplementedInterfaces();
//    builder.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Repository"))
//    .AsImplementedInterfaces();
//}
#endregion

通过扫描程序集注入,我们可以达到避免一条一条注入的烦恼,这个功能也比较实用。

二.Freesql在.net core6中的使用

2.1 先导入包

在这里插入图片描述

2.1 在Program中依赖注入
#region Freesql注入

Func<IServiceProvider, IFreeSql> fsqlFactory = r =>
{

    IFreeSql fsql = new FreeSql.FreeSqlBuilder()
        .UseConnectionString(FreeSql.DataType.SqlServer, r.GetService<IConfiguration>()["ConnectionStrings:CloudDB"])
        .UseMonitorCommand(cmd => Console.WriteLine($"Sql:{cmd.CommandText}"))//监听SQL语句
        .UseAutoSyncStructure(true) //自动同步实体结构到数据库,FreeSql不会扫描程序集,只有CRUD时才会生成表。
        .Build();
    return fsql;
};
builder.Services.AddSingleton<IFreeSql>(fsqlFactory);


#endregion

var app = builder.Build();

//在项目启动时,从容器中获取IFreeSql实例,并执行一些操作:同步表,种子数据,FluentAPI等
using (IServiceScope serviceScope = app.Services.CreateScope())
{
    var fsql = serviceScope.ServiceProvider.GetRequiredService<IFreeSql>();
    //fsql.CodeFirst.SyncStructure(typeof(Topic));//Topic 为要同步的实体类//同步实体类到数据库
}

数据库链接写在了appsettings.json中,注入的话可以直接抄官方文档

    Func<IServiceProvider, IFreeSql> fsql = r =>
    {
        IFreeSql fsql = new FreeSql.FreeSqlBuilder()
            .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=freedb.db")//@"Data Source=freedb.db"这里可以直接写数据库链接语句,如果想写在appsettings.json中的话,可以看下上面我的那种写法。
            .UseMonitorCommand(cmd => Console.WriteLine($"Sql:{cmd.CommandText}"))//监听SQL语句
            .UseAutoSyncStructure(true) //自动同步实体结构到数据库,FreeSql不会扫描程序集,只有CRUD时才会生成表。
            .Build();
        return fsql;
    };
    services.AddSingleton<IFreeSql>(fsql);

三.架构分成

在这里插入图片描述

3.1 Models层

这一层就是实体类,我这里使用的是Freesql,实体类配置可查阅官方文档(也可以使用SQLSugar),这两种我比较常用。

3.2 LoginRepositorys层

这一层是用于数据处理,里面分两个文件夹,IRepositorys接口层和Repositorys实现层。具体用法如下:

//IRepositorys接口层
    public interface ILoginRepositorys
    {
        Task<int> Login(string Account,string Password);
    }
//Repositorys实现层
 public class LoginRepositorys : ILoginRepositorys
    {
        private readonly IFreeSql _fsql;
        public LoginRepositorys(IFreeSql fsql)
        {
            this._fsql = fsql;
        }
        //登录查询
        public async Task<int> Login(string Account, string Password)
        {
            var curd = (await _fsql.Select<UserInfo>().Where(x => x.Account == Account && x.Password == Password).ToListAsync()).Count();
            return curd;
        }
    }
3.3 Services层

这层就是来写业务了,里面也是分两个文件夹,IServices接口层和Services实现层。具体用法如下:

//IServices接口层
public interface ILoginServices
    {
        Task<int> Login(string Account, string Password);
    }
//Services实现层
public class LoginServices : ILoginServices
    {
        private readonly ILoginRepositorys _loginRepositorys;

        public LoginServices(ILoginRepositorys loginRepositorys)
        {
            this._loginRepositorys = loginRepositorys;
        }
        //登录查询
        public async Task<int> Login(string Account, string Password)
        {
            int Msg = 0;
            try
            {
                if (string.IsNullOrWhiteSpace(Account))
                {
                    throw new Exception("账号不能为空!");
                }
                if (string.IsNullOrWhiteSpace(Password))
                {
                    throw new Exception("密码不能为空!");
                }
                if (await _loginRepositorys.Login(Account,Password)> 0)
                {
                    Msg = 1;
                }
            }
            catch (Exception ex)
            {
                return Msg;
            }
            return Msg;
        }
    }

这里我们只需要做业务处理即可,如码所示,当我们处理业务时只需要调用LoginRepositorys层即可,这样充分展现了高内聚、低耦合的设计,而且后期易于维护,当数据库发生变化时,只需要修改LoginRepositorys层,就不用修改业务层了。

3.4 控制器层(API层)
[Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly ILoginServices _loginServices;

        public HomeController(ILoginServices loginServices)
        {
            this._loginServices = loginServices;
        }
        [HttpGet]
        public string Word()
        {
            return "Hello Word!";
        }
        [HttpGet]
        public string Login(string account, string password)
        {
            string Meg = "我是测试!";
            if (account == "admin" && password == "123456")
            {
                Meg = "测试成功了!";
            }
            return Meg;
        }
        [HttpGet]
        public async Task<int> Logins(string Account, string Password)
        {
            //使用MD5加密
            string Passwords = MD5Helper.MD5Encrypt64(Password);
            return (await _loginServices.Login(Account, Passwords));
        }
    }

主要思想:前端—>控制器层(API层)—>Services层—>LoginRepositorys层
目前是写了个比较简单的框架搭建Demo,后续会继续补充,也会继续开发别的框架Demo,学无止境!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七、进程程序替换

文章目录 一、进程程序替换&#xff08;一&#xff09;概念&#xff08;二&#xff09;为什么程序替换&#xff08;三&#xff09;程序替换的原理&#xff08;四&#xff09;如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换&#xff0c;会不会影响父进程呢? &…

node.js卸载、安装、配置详解

node.js卸载、安装、配置详解 一、 node.js卸载二、下载安装2.1 下载2.2 安装2.2.1 选择msi安装2.2.2 选择zip安装 三、配置3.1 环境变量配置3.2 修改缓存、全局模块路径3.3 全局安装3.4 设置淘宝镜像3.5 全局安装 四、node-red安装及配置 一、 node.js卸载 第一步&#xff1a…

Salesforce顾问如何实现逆袭成为公司CIO?

Salesforce是一个适用于所有业务流程的绝佳平台&#xff0c;它的设置方式意味着使用者可以培养出独特的技能。其中一些从业者非常适合担任高管&#xff0c;Trailblazers通常会晋升到高层职位。 本文将帮助Trailblazers了解职位晋升需要的能力&#xff0c;为Salesforce之旅做好…

【大数据原理与技术】期末习题总结大全,建议收藏

【大数据原理与技术】期末习题总结大全&#xff0c;建议收藏 &#x1f4e2;&#x1f4e2;题目来源于B站&#xff0c;慕课网&#xff0c;百度 &#xff0c;适用于期末复习&#xff0c;内容仅供参考&#xff0c;祝大家考试顺利&#xff01; &#x1f4e2;以下思维导图我是根据我们…

LiveGBS国标GB/T28181流媒体平台功能-作为下级国标平台级联到第三方海康大华宇视华为等国标平台及其它政务公安内网国标视频平台

LiveGBS国标GB/T28181流媒体平台功能-作为下级国标平台级联到第三方海康大华宇视华为等国标平台及其它政务公安内网国标视频平台 1、GB/T28181级联是什么2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入…

固定翼、免像控、相对精度优于10cm,农村不动产项目验证

前言 在航测外业作业中&#xff0c;布设相控点应该是耗时最多的工作&#xff0c;繁琐而辛苦。本次&#xff0c;中水成勘院联合成都睿铂&#xff0c;以睿铂DG4pros五镜头倾斜相机为载荷&#xff0c;纵横CW10型固定翼无人机为载机&#xff0c;共同进行免像控相对精度项目验证。希…

软件测试常见的20个误区,你真的了解吗?

常见的20个误区 今天分享软件测试中常遇到的 20 个误区&#xff0c;争取能给想从事软件测试的小伙伴一点启发。 1、测试人员不需要了解软件开发知识 抛开自动化测试&#xff0c;测试开发等&#xff0c;这些是必须要学习软件开发知识。功能测试和接口测试等还是需要软件开发知…

VUE3-组件问题

VUE3-组件问题 文章目录 VUE3-组件问题一、S-Table1.问题描述2.问题展示3.问题解决 二、form表单无法显示1.问题描述2.问题展示3.问题解决 一、S-Table 1.问题描述 一个页面存在两个S-table&#xff0c;经检查均无误&#xff0c;第一个S-Table刷新可用&#xff0c;第二个刷新…

迷茫了5年:做完这个测试项目,我终于决定跳槽!

2023年早已过半&#xff0c;来个迟到的年中总结&#xff0c;说实话&#xff0c;2023&#xff0c;很迷茫&#xff0c;然后过的非常不如意&#xff0c;倒不是上一年的职业目标没达到&#xff0c;而是接下来的路根本不知道如何走。在没解决这个问题之前&#xff0c;或者说没搞清楚…

numpy知识点总结

numpy 基本介绍 ufunc 接口方法的基础 reduce&#xff0c;聚合方法 accumulate&#xff0c;累计聚合 reduceat&#xff0c;按指定轴向、指定切片聚合 outer&#xff1a;外积 ndarray 数据结构的基础 数组的创建 特定的函数结构 从特定库函数创建 random系列 特定的结构创建数…

9. 支持向量机(SVM)

9.1 优化目标 在逻辑回归中做一些小改动变成支持向量机。 如果观察逻辑回归的代价函数&#xff0c;会发现每个样本(x,y)都会为总的代价函数增加如下图这一项。因此对于总的代价函数&#xff0c;我们通常对所有的训练样本从第1项到第m项进行求和。 图中的这一表达式就代表每个单…

CnOpenData小巨人和单项冠军企业专利及引用被引用数据

一、数据简介 专精特新”一词最早来源于2011年7月&#xff0c;由时任工信部总工程师朱宏任在《中国产业发展和产业政策报告&#xff08;2011&#xff09;》新闻发布会上首次提出。“专精特新”是指具备专业化、精细化、特色化、创新型四大优势的企业。根据工信部的定义&#xf…

单层玻璃隔断移门轨道滑轮如何安装

在家居装修中&#xff0c;隔断是不可或缺的一部分。而单层玻璃隔断因其时尚美观和装修效果好&#xff0c;备受人们的喜爱。在单层玻璃隔断中&#xff0c;移门轨道和滑轮的选择及安装也是至关重要的一环。下面&#xff0c;阁瑞活动隔断就为大家详细介绍一下单层玻璃隔断移门轨道…

javaScript蓝桥杯----年度明星项⽬

目录 一、介绍二、准备三、⽬标四、代码五、完成 一、介绍 作为前端开发的主⼒语⾔&#xff0c; JavaScript 相关的开源项⽬是每⼀个前端开发者都应该多多关注的。我们可以通过这⼀年新增 star 的数量来判断⼀个开源项⽬的流⾏趋势。 本题请实现⼀个展示 2022 年 JavaScript 明…

【MySQL数据库 | 第六篇】DDL操作 表

目录 &#x1f914;前景知识&#xff1a; 数据类型&#xff1a; 1. 数值类型 2. 字符串类型 3. 日期时间类型 &#x1f914;DDL操作表&#xff1a; 1.创建 示例&#xff1a;尝试创建把以下实例创建到表里 2.查询 1.查询当前数据库的所有表&#xff1a; &#x1f50…

Ai前沿技术汇总[1]:Quivr非结构化信息搜索、Drag Your GAN AI修图、MiniGPT-4、Falcon-40B、localGPT

“AI前沿技术”专栏汇集了最前沿的人工智能技术&#xff0c;包括自然语言处理、语音识别、图像识别、机器学习、深度学习、强化学习、计算机视觉、区块链技术、智能机器人技术和虚拟现实技术等。本专栏将带您了解人工智能领域的最新进展和研究成果&#xff0c;探索人工智能技术…

软件测试的案例分析 - 闰年4.2 (加投票)

这篇博客的目录 文章目的正文错误之一出错后怎么改正&#xff1f;正确而简明的算法 文章目的 显示不同的博客能获得多少博客质量分 &#xff08;这是关于博客质量分的测试 https://www.csdn.net/qc) 这个博客得了 60 分。 希望在新的质量分系统中&#xff0c;获得 80 - 90 分左…

NoSQL数据库

NoSQL数据库 NoSQL简介NoSQL兴起的原因NoSQL与关系数据库的对比NoSQL的四大类型键值数据库列族数据库文档数据库图形数据库不同类型数据库比较分析RedisMongoDBCassandraNeo4j NoSQL三大基石CAPBASE最终一致性 NoSQL简介 “Not Only SQL”泛指非关系型的数据库&#xff0c;区别…

简单分享怎么通过微信小程序开店

小程序开店的好处 1.可以为用户提供更多的便利。通过使用微信或其他社交媒体&#xff0c;可以随时随地与潜在客户进行交流互动。 2.让消费者体验更好。通过二维码、小程序代码等方式&#xff0c;消费者能够快速找到所需产品和服务。 3.有助于降低营销成本。相比传统销售渠道…

关于Idea的一些常用设置项

1. 输出中文不乱码 设置工程项目编码 file -> settings -> Editor -> File Encodings-> 如下图通通UTF-8 2. 创建文件自动设置本文模板 File–>settings–>Editor–>File and Code Templates–>Includes -> 输入类注释模板 /*** Classname ${N…