【问题标题】:Sharing a delegate property between methods在方法之间共享委托属性
【发布时间】:2019-10-10 11:53:28
【问题描述】:

我在自己的扩展方法中使用 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 之类的东西来映射所有令人讨厌的属性。

【问题讨论】:

    标签: c# .net .net-core swagger extension-methods


    【解决方案1】:

    我觉得你正在尝试做这样的事情

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      相关资源
      最近更新 更多