Совместное использование свойства делегата между методами - PullRequest
1 голос
/ 10 октября 2019

Я работаю с типом Action<T1> в своем собственном методе расширения, хотя я хотел бы создать свойство в делегате, а затем передать это свойство делегата другому методу, который также добавит свойства.

Примером этого может быть, если я напишу свои собственные методы расширения для добавления сваггера в 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 и изучить его использование в действии, но тогда мне, вероятно, понадобится что-то вроде Automapper, чтобы отобразить все свойства, которые будут раздражать.

1 Ответ

2 голосов
/ 10 октября 2019

У меня сложилось впечатление, что вы пытаетесь сделать что-то вроде этого

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