在方法之间共享委托 属性

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();