栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

.NET6 Web Api+EfCore+Autofac+AutoMapper实战

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.NET6 Web Api+EfCore+Autofac+AutoMapper实战

整合EfCore到.net6

开始前的准备

创建Asp.Net Core Web Api项目项目介绍 开始使用

1. 安装所需要的Nuget包 ;2. 创建类库;3.设计类库; 项目整合

Program.cs类的配置 添加UserController,跑起来。

开始前的准备 创建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.json与appsettings.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
    {
        /// 
        /// 获取用户表信息
        /// 
        /// 
        Task> GetAllList();
    }
 public class RepositoryUser : EFRepository, IRepositoryUser
    {
        public RepositoryUser(UserContext dbContext) : base(dbContext)
        {
        }

        /// 
        /// 查询用户表信息
        /// 
        /// 
        public async Task> GetAllList()
        {
            return await DbContext.Set().
                 FromSqlRaw(sql: "Select * from Users").ToListAsync();
        }
    }

IService与Service层配置
需要新建一个IService的接口,不需要干任何东西。为了IOC自动注入获取标记。
用心的小伙伴可能看到了,我们Service层用的DTO,Repository层用的是Entity

public interface IServiceUser : IService
    {
        /// 
        /// 获取用户表信息
        /// 
        /// 
        Task> GetAllList();
    }
 public class ServiceUser : IServiceUser
    {
        private readonly IMapper _mapper;

        private readonly IRepositoryUser _userRepository;

        public ILogger _logger;

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

        public async Task> GetAllList()
        {
            var res = await _userRepository.GetAllList();
            return _mapper.Map>(res);
        }
    }

UserContext,这个我是写在了IRepository层。UserContext我们需要自动注入到DbContext。如下我们需要UserContext继承于DbContext重写OnModelCreating。这里就不做过多赘述了。我们需要在Program.cs去注入,这个稍后我们在来看。

 public class UserContext : DbContext
    {
        public UserContext([NotNull] DbContextOptions options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //modelBuilder.HasDefaultSchema("testdb");//指定默认架构
            modelBuilder.Entity().HasNoKey();//不必用以往写字段去搞
            //modelBuilder.Entity().HasNoKey();//忽略数据库映射
            //modelBuilder.Entity().HasNoKey();//忽略数据库映射
            //modelBuilder.Entity().HasNoKey();//忽略数据库映射
            base.OnModelCreating(modelBuilder);
        }
    }

到了这一步,基本的关系我们是建立好了。接下来我们整合

项目整合 Program.cs类的配置

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

builder.Services.AddSqlServer(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(con => {
    con.RegisterModule(new ConfigurationModule(builder.Configuration));
});
builder.Services.AddAutoMapper(typeof(DtoProfile));
builder.Services.AddMvc();
builder.Services.AddSqlServer(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())
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();
        }
    }

3.DemoRepository层也是如此

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

            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(con => {
    con.RegisterModule(new ConfigurationModule(builder.Configuration));
});
添加UserController,跑起来。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785163.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号