开始前的准备
创建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。
这不就是把语法简化了一下,相应的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>
{
Task<List<UserEntity>> GetAllList();
}
public class RepositoryUser : EFRepository<UserContext, UserEntity>, IRepositoryUser
{
public RepositoryUser(UserContext dbContext) : base(dbContext)
{
}
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
{
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.Entity<UserEntity>().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();
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,跑起来。
|