在方法之间共享委托 属性
Sharing a delegate property between methods
我在自己的扩展方法中使用类型 Action<T1>
,尽管我想在委托中构建一个 属性 然后传递该委托 属性另一种方法也将添加属性。
这方面的一个例子是,如果我要编写自己的扩展方法以将 swagger 添加到 IServiceCollection
。假设有一个 OperationFilter
和一个 DocumentFilter
以及我在 SwaggerGenOptions
上设置的许多其他标准属性,所以我决定创建自己的 NuGet 包一个默认的 IServiceCollection
扩展,用于在我的所有服务中执行所有这些操作。
我想要类似于以下内容的内容(或将过去的委托属性与 AddSwaggerGen
调用中此方法中设置的委托属性相结合):
public static IServiceCollection AddCommonSwaggerGen(this IServiceCollection services, Action<SwaggerGenOptions> options)
{
// Somehow I'd like to do this:
options.OperationFilter<MyOperationFilter>();
options.DocumentFilter<MyDocumentFilter>();
options.OrderActionsBy(a => a.RelativePath);
options.DescribeAllEnumsAsStrings();
// Then I can just pass it in to AddSwaggerGen
services.AddSwaggerGen(options);
return services;
}
然后在每个应用程序中,我想做类似的事情:
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1.0", new OpenApiInfo() { Title = "Micro Service 1 Api v1.0", Version = "v1.0" });
// Also set other option properties customised to each service
});
实现此目标的最佳方法是什么,还是无法以这种方式实现?
我的下一个选择是在 SwaggerGenOptions
中传递并在 Action 中使用它进行调查,但是我可能需要类似 Automapper
的东西来映射所有属性刺激。
我觉得你正在尝试做这样的事情
public static IServiceCollection AddCommonSwaggerGen(
this IServiceCollection services, Action<SwaggerGenOptions> configure == null) {
services.AddSwaggerGen(options => {
//Common
options.OperationFilter<SwaggerRemoveVersionFromParameter>();
options.DocumentFilter<SwaggerReplaceVersionWithExactValueInPath>();
options.OrderActionsBy(a => a.RelativePath);
options.DescribeAllEnumsAsStrings();
//additional options configuration
configure?.Invoke(options);
});
return services;
}
然后在每个应用程序中,执行如下操作:
services.AddCommonSwaggerGen(options => {
options.SwaggerDoc("v1.0", new OpenApiInfo() { Title = "Micro Service 1 Api v1.0", Version = "v1.0" });
// Also set other option properties customized to each service
});
或
services.AddCommonSwaggerGen();
我在自己的扩展方法中使用类型 Action<T1>
,尽管我想在委托中构建一个 属性 然后传递该委托 属性另一种方法也将添加属性。
这方面的一个例子是,如果我要编写自己的扩展方法以将 swagger 添加到 IServiceCollection
。假设有一个 OperationFilter
和一个 DocumentFilter
以及我在 SwaggerGenOptions
上设置的许多其他标准属性,所以我决定创建自己的 NuGet 包一个默认的 IServiceCollection
扩展,用于在我的所有服务中执行所有这些操作。
我想要类似于以下内容的内容(或将过去的委托属性与 AddSwaggerGen
调用中此方法中设置的委托属性相结合):
public static IServiceCollection AddCommonSwaggerGen(this IServiceCollection services, Action<SwaggerGenOptions> options)
{
// Somehow I'd like to do this:
options.OperationFilter<MyOperationFilter>();
options.DocumentFilter<MyDocumentFilter>();
options.OrderActionsBy(a => a.RelativePath);
options.DescribeAllEnumsAsStrings();
// Then I can just pass it in to AddSwaggerGen
services.AddSwaggerGen(options);
return services;
}
然后在每个应用程序中,我想做类似的事情:
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1.0", new OpenApiInfo() { Title = "Micro Service 1 Api v1.0", Version = "v1.0" });
// Also set other option properties customised to each service
});
实现此目标的最佳方法是什么,还是无法以这种方式实现?
我的下一个选择是在 SwaggerGenOptions
中传递并在 Action 中使用它进行调查,但是我可能需要类似 Automapper
的东西来映射所有属性刺激。
我觉得你正在尝试做这样的事情
public static IServiceCollection AddCommonSwaggerGen(
this IServiceCollection services, Action<SwaggerGenOptions> configure == null) {
services.AddSwaggerGen(options => {
//Common
options.OperationFilter<SwaggerRemoveVersionFromParameter>();
options.DocumentFilter<SwaggerReplaceVersionWithExactValueInPath>();
options.OrderActionsBy(a => a.RelativePath);
options.DescribeAllEnumsAsStrings();
//additional options configuration
configure?.Invoke(options);
});
return services;
}
然后在每个应用程序中,执行如下操作:
services.AddCommonSwaggerGen(options => {
options.SwaggerDoc("v1.0", new OpenApiInfo() { Title = "Micro Service 1 Api v1.0", Version = "v1.0" });
// Also set other option properties customized to each service
});
或
services.AddCommonSwaggerGen();