修复set.ServiceAddress为空时导致的对象为空Bug
猿人易 编写于 2024-05-17 17:50:25
NewLife.Cube
using CubeDemo;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using NewLife.Cube;
using NewLife.Cube.WebMiddleware;
using NewLife.Log;
using Swashbuckle.AspNetCore.SwaggerGen;

XTrace.UseConsole();

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;

// 引入星尘,设置监控中间件
var star = services.AddStardust(null);
TracerMiddleware.Tracer = star?.Tracer;

//services.AddHttpContextAccessor();

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, SwaggerConfigureOptions>();
builder.Services.AddSwaggerGen(options =>
{
    // 解决 NewLife.Setting 与 XCode.Setting 冲突的问题
    options.CustomSchemaIds(type => type.FullName);
    options.IncludeXmlComments("NewLife.Cube.xml".GetFullPath());

    options.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "第三代魔方", Description = "第三代魔方WebApi接口,用于前后端分离。" });
    //options.SwaggerDoc("Basic", new OpenApiInfo { Version = "basic", Title = "基础模块" });
    //options.SwaggerDoc("Admin", new OpenApiInfo { Version = "admin", Title = "系统管理" });
    //options.SwaggerDoc("Cube", new OpenApiInfo { Version = "cube", Title = "魔方管理" });

    options.DocInclusionPredicate((docName, apiDesc) =>
    {
        if (apiDesc.ActionDescriptor is not ControllerActionDescriptor controller) return false;

        var groups = controller.ControllerTypeInfo.GetCustomAttributes(true).OfType<IApiDescriptionGroupNameProvider>().Select(e => e.GroupName).ToList();

        if (docName == "v1" && (groups == null || groups.Count == 0)) return true;

        return groups != null && groups.Any(e => e == docName);
    });
});

services.AddCube();

var app = builder.Build();

// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    //app.UseSwaggerUI();
    app.UseSwaggerUI(options =>
    {
        //options.SwaggerEndpoint("/swagger/Basic/swagger.json", "Basic");
        //options.SwaggerEndpoint("/swagger/Admin/swagger.json", "Admin");
        //options.SwaggerEndpoint("/swagger/Cube/swagger.json", "Cube");
        //options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
        options.RoutePrefix = String.Empty;
        var groups = app.Services.GetRequiredService<IApiDescriptionGroupCollectionProvider>().ApiDescriptionGroups.Items;
        foreach (var description in groups)
        {
            var group = description.GroupName ?? "v1";
            options.SwaggerEndpoint($"/swagger/{group}/swagger.json", group);
        }
    });
}

app.UseCube(builder.Environment);

app.UseAuthorization();

app.MapControllerRoute(name: "default", pattern: "{controller=Index}/{action=Index}/{id?}");
app.MapControllers();

app.RegisterService("CubeDemo", null, builder.Environment.EnvironmentName, "/cube/info");

app.Run();