依赖注入

由容器统一创建对象并管理其创建对象的生命周期;

AddTransient瞬时服务

每次使用都会创建新的实例

AddScoped作用域

容器或子容器的生命周期内,对象保持一致,如果容器释放掉,那就意味着对象也会释放掉;

AddSingleton单例

整个根容器的生命周期内是同一个对象

其他

TryAddScoped

AddHttpClient

AddHttpContextAccessor//请求管道

AddDbContext //EF CORE

AddControllers

批量注入

var assembly = Assembly.GetExecutingAssembly();
var ilist = assembly.GetTypes().Where(t => t.GetTypeInfo().IsInterface);
var list = assembly.GetTypes().Where(t => t.GetTypeInfo().IsClass);
foreach (Type serviceType in list)
{
    var interfaceType = ilist.FirstOrDefault(x => x.IsAssignableFrom(serviceType));
    if (interfaceType != null)
    {
        
            services.AddScoped(interfaceType, serviceType);
     
    }
}

其他生命周期中获取服务

private readonly IServiceProvider _serviceProvider;
public Test(IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
}

public void test1()
{
    using(var scope = this._serviceProvider.CreateScope())
    {
        //.NetCore 中IServiceProvider的 GetService()和GetRequiredService()之间的区别
        //GetService- 如果服务未注册,则返回null
        //GetRequiredService- 如果服务未注册,则抛出一个Exception异常
        var appointmentService = scope.ServiceProvider.GetService<IAppointmentService>();
    }
}

中间件

系统自带

UseHttpsRedirection:强制https跳转

....

用途:

  1. 全局拦截,如:IP白名单,请求头过滤
  2. 错误处理,如:未处理异常处理、自定义异常(登录失败,参数错误等)处理
  3. 权限校验
  4. 。。。

配置文件application.json

读取方式:

  1. Configuration["A"]
  2. Configuration["Serilog:LogPath"]
  3. Configuration.GetValue<bool>("DetailedErrors")
  4. Configuration.GetConnectionString("KKBMConnection")
  5. Configuration.Get<TOption>("")

选项模式

public class PositionOptions
{
    public const string Position = "Position";

    public string Title { get; set; } = String.Empty;
    public string Name { get; set; } = String.Empty;
}

using ConfigSample.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<PositionOptions>(
    builder.Configuration.GetSection(PositionOptions.Position));

var app = builder.Build();

IOptions、IOptionsMonitor以及IOptionsSnapshot的区别

配置项目启动地址

  1. 修改launchSettings.json
  2. builder.WebHost.UseUrls("http://0.0.0.0:5552", "https://127.0.0.1:5553", "https://localhost:5554")
  3. app.Urls.Add("http://*:6666");app.Urls.Add("http://+:8888");app.Urls.Add("http://0.0.0.0:9999");

WebApi

ActionResult返回类型

return result;

return Ok(result);//200

return BadRequest(result);/400

CORS允许跨域请求

builder.Services.AddCors(options =>
{
    options.AddPolicy("cors", policy =>
    {
        policy.AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials()
              .WithOrigins("https://www.kkbmtj.com", "http://webadmin.kkbmtj.com", "https://webadmin.kkbmtj.com");
    });
});
//......
var app = builder.Build();
app.UseCors("cors");

System.Text.Json API

.netcore 中,尽量使用Syetem.Text.Json来序列化JSON,官方地址:System.Text.Json 序列化与反序列化

JsonSerializer.Serialize(obj)

JsonSerializer.Deserialize<T>(string)

jsonSerializer.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;//驼峰规则
jsonSerializer.PropertyNameCaseInsensitive = true;//是否区分大小写
jsonSerializer.Converters.Add(new SystemTextJsonConvert.DateTimeConverter());//自定义时间序列化
jsonSerializer.Converters.Add(new SystemTextJsonConvert.DateTimeNullableConverter());
jsonSerializer.Converters.Add(new SystemTextJsonConvert.LongToStringConverter());
jsonSerializer.Converters.Add(new SystemTextJsonConvert.LongNullToStringConverter());
jsonSerializer.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);//解析格式,兼容中文
jsonSerializer.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;//忽略null值

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
    }
}

进阶

JsonDocument

JsonElement

JsonSerializer.DeserializeAsync(Stream)

HttpClient

官方文档:在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求

注入服务:Service.AddHttpClient();

 

 

 

posted on 2022-10-20 14:55  叶子牛牛  阅读(203)  评论(0编辑  收藏  举报