在 Net.Core 6 專案中,我有IEndpoint擴展名
public interface IEndpoint {
void Map(IEndpointRouteBuilder builder);
}
以及一個實作示例:
public class CountryEndpoint : IEndpoint {
public void Map(IEndpointRouteBuilder builder) {
builder.MapGet("countries", async ([FromServices] IService service) => {
List<Country> countries = await service.GetCountries();
return Results.Ok(countries);
})
.WithName("Countries");
.WithApiVersionSet(versionSet)
.MapToApiVersion( 1.0 );
}
}
我使用以下方法在我的應用程式上配置端點:
builder.Services.AddEndpoints(typeof(Program));
WebApplication application = builder.Build();
application.MapEndpoints();
哪里AddEndpoints和MapEndpoints擴展是:
public static IServiceCollection AddEndpoints(this IServiceCollection services, params Type[] types) {
services
.Scan(x => x.FromAssembliesOf(types).AddClasses(y => y.AssignableTo(typeof(IEndpoint))).AsImplementedInterfaces().WithScopedLifetime());
return services;
}
public static class ApplicationBuilderExtensions {
public static IEndpointRouteBuilder MapEndpoints(this IEndpointRouteBuilder builder) {
using (IServiceScope scope = builder.ServiceProvider.CreateScope()) {
IEnumerable<IEndpoint> endpoints = scope.ServiceProvider.GetServices<IEndpoint>();
foreach (IEndpoint endpoint in endpoints)
endpoint.Map(builder);
}
return builder;
}
}
問題
在CountryEndpoint's Map` 方法上,我有:
.WithApiVersionSet(versionSet)
該versionSet變數在Program代碼中創建如下:
ApiVersionSet versionSet = application.NewApiVersionSet().HasApiVersion(new ApiVersion(1.0)).ReportApiVersions().Build();
如何創建這樣的變數并在 Endpoints 的Map方法中使用它?
通常versionSet變數和Map方法都在Program代碼中。
uj5u.com熱心網友回復:
您可以使用相應的靜態欄位(例如部分Program類)創建靜態類,并使用它來存盤值并在以下位置使用它Map:
頂級陳述句 ( Program.cs):
...
ApiVersionSet versionSet = application.NewApiVersionSet().HasApiVersion(new ApiVersion(1.0)).ReportApiVersions().Build();
VersionSet = versionSet;
application.MapEndpoints(); // use Program.VersionSet in IEndpoint.Map implementation
...
// end of top-level statement
static partial class Program
{
internal static ApiVersionSet VersionSet {get;set;}
}
但我認為,將ApiVersionSet引數設定為IEndpoint.MapandApplicationBuilderExtensions.MapEndpoints將是一種更好的方法:
public interface IEndpoint {
void Map(IEndpointRouteBuilder builder, ApiVersionSet versionSet);
}
public static class ApplicationBuilderExtensions {
public static IEndpointRouteBuilder MapEndpoints(this IEndpointRouteBuilder builder, ApiVersionSet versionSet) {
using (IServiceScope scope = builder.ServiceProvider.CreateScope()) {
IEnumerable<IEndpoint> endpoints = scope.ServiceProvider.GetServices<IEndpoint>();
foreach (IEndpoint endpoint in endpoints)
endpoint.Map(builder, versionSet); // pass it here
}
return builder;
}
}
在頂級宣告中:
ApiVersionSet versionSet = ...;
application.MapEndpoints(versionSet);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486776.html
