IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> .NET6 Web Api+EfCore+Autofac+AutoMapper实战 -> 正文阅读

[开发工具].NET6 Web Api+EfCore+Autofac+AutoMapper实战

开始前的准备

创建Asp.Net Core Web Api项目

如果勾选启用Docker会生成相应的Dockerfile文件,勾选Use controllers表示我们创建的Web Api项目带有Controller,不勾选的话是MinimApi,它是在Program.cs中以goes to运行,为了性能而生。这里我们用的DotNet7
在这里插入图片描述

项目介绍

OK,创建好了项目之后我们会发现与以往的.NET5、.NET Core不太一样,我们稍微介绍下每个文件的作用。

在这里插入图片描述

  • Properties文件夹下的launchSettings.json文件:

配置IIS、Swagger、项目启动的端口等功能。
在这里插入图片描述

  • Controllers文件夹就不用做过多解释了吧,我们看看自带的WeatherForecastController.cs文件。

我们可以看到有个构造函数 _logger,与以往的New()不一样,这个是构造函数注入进来的,从.NET5还是core之后自带IOC容器。待会我们将自带的IOC改成Autofac。

在这里插入图片描述

  • appsettings.Development.jsonappsettings.json前者是开发环境的配置文件,这里就不赘述。

  • Program.cs文件是我们的核心文件,没有了.NET 5/Core中的Startup.cs文件,我们可以细细的看看。

这不就是把语法简化了一下,相应的builder.Services对应Startup.cs里面的ConfigureServices方法,都是操作IServiceCollection,OK,Build之后我们得到了app,这里对应的是Configure方法。

在这里插入图片描述
OK,了解了基本的项目架构,我们就可以很简单去扩展程序的中间件和管道。

开始使用

1. 安装所需要的Nuget包 ;

在这里插入图片描述

2. 创建类库;

DemoDto、DemoEntity、DemoIRepository、DemoRepository、DemoISerive、DemoService类库,并添加Nuget包。

在这里插入图片描述
在这里插入图片描述

3.设计类库;

我们以Users表为基础
在这里插入图片描述

  • Entity和Dto的配置
    在这里插入图片描述
  • IRepository与Repository的配置。
    在这里插入图片描述
public interface IRepositoryUser : IEFRepository<UserContext, UserEntity>
    {
        /// <summary>
        /// 获取用户表信息
        /// </summary>
        /// <returns></returns>
        Task<List<UserEntity>> GetAllList();
    }
 public class RepositoryUser : EFRepository<UserContext, UserEntity>, IRepositoryUser
    {
        public RepositoryUser(UserContext dbContext) : base(dbContext)
        {
        }

        /// <summary>
        /// 查询用户表信息
        /// </summary>
        /// <returns></returns>
        public async Task<List<UserEntity>> GetAllList()
        {
            return await DbContext.Set<UserEntity>().
                 FromSqlRaw(sql: "Select * from Users").ToListAsync();
        }
    }
  • IService与Service层配置
    需要新建一个IService的接口,不需要干任何东西。为了IOC自动注入获取标记。
    用心的小伙伴可能看到了,我们Service层用的DTO,Repository层用的是Entity
    在这里插入图片描述
public interface IServiceUser : IService
    {
        /// <summary>
        /// 获取用户表信息
        /// </summary>
        /// <returns></returns>
        Task<List<UserDto>> GetAllList();
    }
 public class ServiceUser : IServiceUser
    {
        private readonly IMapper _mapper;

        private readonly IRepositoryUser _userRepository;

        public ILogger<ServiceUser> _logger;

        public ServiceUser(IMapper mapper,
            IRepositoryUser userRepository,
            ILogger<ServiceUser> logger)
        {
            _mapper = mapper;
            _userRepository = userRepository;
            _logger = logger;
        }

        public async Task<List<UserDto>> GetAllList()
        {
            var res = await _userRepository.GetAllList();
            return _mapper.Map<List<UserDto>>(res);
        }
    }
  • UserContext,这个我是写在了IRepository层。UserContext我们需要自动注入到DbContext。如下我们需要UserContext继承于DbContext重写OnModelCreating。这里就不做过多赘述了。我们需要在Program.cs去注入,这个稍后我们在来看。
    在这里插入图片描述
 public class UserContext : DbContext
    {
        public UserContext([NotNull] DbContextOptions<UserContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //modelBuilder.HasDefaultSchema("testdb");//指定默认架构
            modelBuilder.Entity<UserEntity>().HasNoKey();//不必用以往写字段去搞
            //modelBuilder.Entity<UserEntity1>().HasNoKey();//忽略数据库映射
            //modelBuilder.Entity<UserEntity2>().HasNoKey();//忽略数据库映射
            //modelBuilder.Entity<UserEntity3>().HasNoKey();//忽略数据库映射
            base.OnModelCreating(modelBuilder);
        }
    }
  • 到了这一步,基本的关系我们是建立好了。接下来我们整合

项目整合

Program.cs类的配置

1.注入UserContext,这里的GetConnectionString(“demo”),是我们在appsettings.json里面配置的连接字符串。

builder.Services.AddSqlServer<UserContext>(builder.Configuration.GetConnectionString("demo")!);

在这里插入图片描述

2.注入AutoMapper,DtoProfile是我们自定义的类。这里我放在了Service层。

builder.Services.AddAutoMapper(typeof(DtoProfile));

添加Dto=>Entity和Entity=>Dto的转换。后续添加功能需要添加映射关系,有些麻烦。
在这里插入图片描述
3.Autofac——自动注入
我们使用模块注入,不用后续开发新模块再去添加(ps:AutoMapper)。

OK,在使用模块注入的时候,我们需要做一些准备工作。
1.在Web Api层添加一个autofac.json文件,配置模块注入;
type的第一个参数是文件的路径,第二个是命名空间
在这里插入图片描述

using Autofac;
using Autofac.Configuration;
using Autofac.Extensions.DependencyInjection;
using DemoIRepository;
using DemoService;

var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureAppConfiguration((context, config) =>
{
    config.AddJsonFile("autofac.json", optional: true);
}).UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(con => {
    con.RegisterModule(new ConfigurationModule(builder.Configuration));
});
builder.Services.AddAutoMapper(typeof(DtoProfile));
builder.Services.AddMvc();
builder.Services.AddSqlServer<UserContext>(builder.Configuration.GetConnectionString("demo")!);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddControllersWithViews();
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
  
}
app.UseSwagger();

app.UseSwaggerUI();

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

2.在DemoService类库下添加ServiceModule.cs类文件。继承于Autofac.Module。这里的IService是我们上面提到的,只是为了做标识。
在这里插入图片描述

public class ServiceModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterAssemblyTypes(this.ThisAssembly)
                .Where(t => t.IsAssignableTo<IService>())
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();
        }
    }

3.DemoRepository层也是如此
在这里插入图片描述

public class RepositoryModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<UserContext>()
              .As<DbContext>();

            builder.RegisterAssemblyTypes(this.ThisAssembly)
                .Where(t => t.IsClosedTypeOf(typeof(IRepository<>)))//这里我们用的是泛型所以稍微有些差别
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();
        }
    }

准备工作完毕,去Program.cs配置。我们替换了自带的容器。

builder.Host.ConfigureAppConfiguration((context, config) =>
{
    config.AddJsonFile("autofac.json", optional: true);
}).UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(con => {
    con.RegisterModule(new ConfigurationModule(builder.Configuration));
});

添加UserController,跑起来。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:46:03  更:2022-03-30 18:47:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:23:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码