Dipper/Dipper.Alioth/Web/StarletExtension.cs

75 lines
2.2 KiB
C#

using Dipper.Alioth.Options;
using Dipper.Alioth.Providers;
using Dipper.Alioth.Starlets;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Dipper.Alioth.Web;
public static class StarletExtension
{
public static WebApplicationBuilder AddStarApp(this WebApplicationBuilder builder, Action<StarOption>? action = null)
{
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
var option = new StarOption();
action?.Invoke(option);
builder.Services.AddControllers(options =>
{
options.EnableEndpointRouting = false;
option.MvcOption?.Invoke(options);
})
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
option.JsonOption?.Invoke(options);
})
.AddFlexibleApi(option);
return builder;
}
public static WebApplication UseStarApp(this WebApplication app)
{
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseRouting();
app.MapControllers();
return app;
}
/// <summary>
/// 添加动态接口
/// </summary>
/// <param name="builder"></param>
/// <param name="option"></param>
private static void AddFlexibleApi(this IMvcBuilder builder, StarOption option)
{
builder.ConfigureApplicationPartManager(manager =>
{
manager.ApplicationParts.Add(new AssemblyPart(typeof(IStarlet).Assembly));
foreach (var module in option.Asterisms)
{
module.Initialize();
var assembly = module.GetType().Assembly;
manager.ApplicationParts.Add(new AssemblyPart(assembly));
}
manager.FeatureProviders.Add(new ApiFeatureProvider());
});
builder.Services.Configure<MvcOptions>(options =>
{
options.Conventions.Add(new StarletConvention());
});
}
}