• 学习笔记01:Net Core 常用配置


     常用词汇:

    1.GUID: 默认值设置 有序:NEWSEQUENTIALID()  无序:NEWID()

    2.获取json数据的方法:  IConfiguration["Key:ChidKey"]

    常用代码:
    1.1. 根据数据库生成实体类和数据连接,放在实体类所在项目生成,几乎不用改动,更方便.

    Scaffold-DbContext "Server=(localdb)mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Test

    1.2. startup数据库连接配置与appsettings.json配置

            public StartupDevelopment(IConfiguration configuration)
            {
                Configuration = configuration;
            }

            public IConfiguration Configuration { get; }



    services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyContext")));
    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "ConnectionStrings": {
        "MyContext": "Server=.;Database=BlogDemo;Trusted_Connection=True;MultipleActiveResultSets=true"
    
      }
    
    }

    1.3. HTTPS  HSTS

     services.AddHttpsRedirection(options =>
                {
                    options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
                    options.HttpsPort = 5001;
                });
    
                services.AddHsts(options =>
                {
                    options.Preload = true;
                    options.IncludeSubDomains = true;
                    options.MaxAge = TimeSpan.FromDays(60);
                    options.ExcludedHosts.Add("example.com");
                    options.ExcludedHosts.Add("www.example.com");
                });

    1.4. UseStartup<Startup>(); 使用基于环境的类

     .UseStartup(typeof(StartupDevelopment).GetTypeInfo().Assembly.FullName);

    1.5.1  表为空填写默认数据,在program.cs修改如下

                // CreateWebHostBuilder(args).Build().Run(); 将词句注释掉,
                var host= CreateWebHostBuilder(args).Build();
                using (var scope=host.Services.CreateScope())
                {
                    var services = scope.ServiceProvider;
                    var loggerFactory = services.GetRequiredService<ILoggerFactory>();
                    try
                    {
                        var myContext = services.GetRequiredService<MyContext>();
                        MyContextSeed.SeedAsync(myContext, loggerFactory).Wait();
                    }
                    catch (Exception e)
                    {
                        var logger = loggerFactory.CreateLogger<Program>();
                        logger.LogError(e,"填写默认数据失败");
                    }
                }
    
                    host.Run();

    1.5.2  数据表为

    namespace BlogDemo.Infrastructure.Database
    {
        public class MyContextSeed
        {
            public static async Task SeedAsync(MyContext myContext,
                              ILoggerFactory loggerFactory, int retry = 0)
            {
                int retryForAvailability = retry;
                try
                {
                    // TODO: Only run this if using a real database
                    // myContext.Database.Migrate();
    
                    if (!myContext.Posts.Any())
                    {
                        myContext.Posts.AddRange(
                            new List<Post>{
                                new Post{
                                    Title = "Post Title 1",
                                    Body = "Post Body 1",
                                    Author = "Dave",
                                    LastModified = DateTime.Now
                                },
                                new Post{
                                    Title = "Post Title 2",
                                    Body = "Post Body 2",
                                    Author = "Dave",
                                    LastModified = DateTime.Now
                                },
                                new Post{
                                    Title = "Post Title 3",
                                    Body = "Post Body 3",
                                    Author = "Dave",
                                    LastModified = DateTime.Now
                                }
                            }
                        );
                        await myContext.SaveChangesAsync();
                    }
                }
                catch (Exception ex)
                {
                    if (retryForAvailability < 10)
                    {
                        retryForAvailability++;
                        var logger = loggerFactory.CreateLogger<MyContextSeed>();
                        logger.LogError(ex.Message);
                        await SeedAsync(myContext, loggerFactory, retryForAvailability);
                    }
                }
            }
        }
    }

    1.6.1  Serilog,在program.cs的main方法添加

                Log.Logger = new LoggerConfiguration()
                    // .MinimumLevel.Debug()
                    .MinimumLevel.Error()
                    //  .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                    .MinimumLevel.Override("Microsoft", LogEventLevel.Error)
                    .Enrich.FromLogContext()
                    .WriteTo.Console()
                    .WriteTo.File(Path.Combine("logs", @"log.txt"), rollingInterval: RollingInterval.Day)
                    .CreateLogger();

    1.7.映射

    安装nuget :

    AutoMapper

    AutoMapper.Extensions.Microsoft.DependencyInjection

    创建Extensions/MappingProfile.cs 继承于Profile   (using AutoMapper;)

    然后在构造函数里添加映射

        public class MappingProfile:Profile
        {
            public MappingProfile()
            {
                CreateMap<Post, PostResource>()
      .ForMember(dest=>dest.UpdaDateTime,opt=>opt.MapFrom(src=>src.LastModified)); CreateMap
    <PostResource, Post>(); } }

    在控制器里使用

    var postResources = _mapper.Map<IEnumerable<Post>, IEnumerable<PostResource>>(posts);

    1.8 FluentValidation

    1.安装 FluentValidation

    2.建立PostResourceValidator.添加继承,添加构造函数

        public class PostResourceValidator:AbstractValidator<PostResource>
        {
            public PostResourceValidator()
            {
                RuleFor(x => x.Author)
                    .NotNull()
                    .WithName("作者")
                    .WithMessage("{PropertyName}是必须填写的")
                    .MaximumLength(50)
                    .WithMessage("{PropertyName}的最大长度是{MaxLength}");
            }
        }

    3.在Startup.cs 注册

    services.AddTransient<IValidator<PostResource>, PostResourceValidator>();

    2.1 翻页 过滤 排序

    2.1.1翻页:  Query String  http://localhost:5000/api/posts?pageIndex=2&pageSize=10&orderBy=Id

    1.建立 QueryParameters.cs 数据分页方法类 包含.pageIndex, pageSize, orderBy 等分页参数 
    
    2.建立PostParameters.cs post专用的分页类,继承自QueryParameters.cs 即可.(无特殊条件可以不用写其他内容,继承功能够用即可)

    3.1把PostParameters 传给PostController.cs 的[HttpGet] 如下:
    public async Task<IActionResult> Get(PostParameters postParameters)
    3.2把postParameters传给PostController.cs具体的实现方法
    原来:
    var postList = await _postRepository.GetAllPostAsync();
    改为:
    var postList = await _postRepository.GetAllPostAsync(postParameters);
    3.3给接口添加参数
    同时修改接口
    原来:
    Task<PaginatedList<Post>> GetAllPostAsync();
    改为:
    Task<PaginatedList<Post>> GetAllPostAsync(PostParameters postParameters);
    3.4在实现类添加参数 PostParameters postParameters,同时原来的列表方法修改下如下
    原来为直接列出列表数据.
    return await _myContext.Post.ToListAsync();
    改为:
    1.按Id排序
    var query = _myContext.Post.OrderBy(x => x.Id);
    
    2.数据分页
    var data = await query.Skip(postParameters.PageIndex * postParameters.PageSize)
    .Take(postParameters.PageSize).ToListAsync();







     

    2.1 REST

     

    2.2 HTTP GET

    2.2 状态码

    200系列 成功

    400系列 客户端引起的错误

    500系列 服务器端引起的错误

  • 相关阅读:
    Ambient Intelligence in Networked Society
    如何定位问题及如何区分前后端BUG
    接口测试-结合Postman的使用
    Selenium的PageObject设计模式(2)
    Selenium的PageObject设计模式(1)
    Git+Pycharm 分布式版本管理
    php中不用内置函数实现字符串转整形
    mysql中case使用
    快速排序
    魔术方法__sleep(),__wakeup()
  • 原文地址:https://www.cnblogs.com/dxh0535/p/10381348.html
Copyright © 2020-2023  润新知